dll 窗体重用的问题,请伸援手!真的没人帮我? (50分)

  • 主题发起人 主题发起人 xuziling20
  • 开始时间 开始时间
X

xuziling20

Unregistered / Unconfirmed
GUEST, unregistred user!
可能SHOW的函数写的有问题,该如何写窗体的show,
另如下所写时,错误: undeclared identifier:'application'因此DLL编译通不过! 为啥呢????
不要因恶小而不为,我可是想破头了啊,没办法,才开始嘛!

library pp;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

uses
SysUtils,
Classes,
Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

function showes() integer;stdcall;
var form:tform1;
begin
form:=tform1.Create (appliction);
result:=form.ShowModal ;
form.free;
end;
exports showes;
begin
end.
在引用主程序中如下引用此函数
var my:function():integer;
.......
my(application);
 
var my:function():integer;stdcall
my();
 
公用对象 application 的声明在Form单元,在uses后面加一个Form,就行了。
还有,在主程序中声明my函数时也有问题,应写成:
function my():integer;external 'pp.dll';stdcall;
{external 说明这个函数在pp.dll文件中,stdcall 说明这个函数是标准调用
 
给你一个完整的解决方法:

1、你写的函数应该放在窗体里,这样可以保证窗体的独立性,没有必要放在工程文件中,
只要在工程文件中exports这个函数就行了;
2、改写一下你的函数,至少应该有一个try..finally,这样比较可靠一些;
例如:
function showes(AHandle:THandle):integer;stdcall;
var
form:TForm1;
begin
Application.Handle := AHandle;//去掉状态栏上的窗体图标
form:=tform1.Create (appliction);
try
result:=form.ShowModal ;
finally
form.free;
end;
end;
函数调用方法:showes(appliction.Handle);
3、DLL中的窗体和普通窗体没什么区别,但在调用时会在windows的状态栏上多出
一个程序图标,想去掉它,还需要做些小工作,上面的例子代码已经做了处理,有
注释。这样做还有一个好处,就是DLL中窗体的图标也变成应用程序的图标了:)
 
接受答案了.
 
后退
顶部