有关dll调用的问题(50分)

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

xzsyz

Unregistered / Unconfirmed
GUEST, unregistred user!
我的dll在调用结束时出现指针错误代码如下
library syz;


uses
SysUtils,
Classes,
activex,
about in 'about.pas' {frmabout};

{$R *.RES}
exports
showabout index 1;
begin
coinitialize(nil);
end.


unit about;

interface

uses
sharemem,Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;

type
Tfrmabout = class(TForm)
imgabt: TImage;
shpimg: TShape;
lab2: TLabel;
lab1: TLabel;
Panel1: TPanel;
lab3: TLabel;
lab4: TLabel;
lab6: TLabel;
lab8: TLabel;
btnok: TButton;
lab7: TLabel;
lab5: TLabel;
private
{ Private declarations }
public
{ Public declarations }
end;
procedure showabout(Ahandle:Thandle;caption,version,company:pchar)
stdcall;


implementation



{$R *.DFM}

procedure showabout(Ahandle:Thandle;caption,version,company:pchar)
stdcall;
var
frmAbout:Tfrmabout;
begin
application.Handle:=Ahandle;
frmAbout:=Tfrmabout.Create(nil);

frmAbout.caption:=strpas(caption);
frmAbout.lab1.Caption:=strpas(caption);
frmAbout.lab2.Caption:=strpas(version);
frmAbout.lab3.Caption:=strpas(company);
try
frmAbout.showmodal;
finally
frmAbout.free;
end;

end;


end.

dll是在d5下写的,调用是在d6下调用的,不知是不是这个原因
 
application.Handle:=Ahandle;
这行代码何故?既是题时,又是请教
 
application.Handle:=Ahandle;
这句话可以在<<delphi 5 开发人员指南>>在dll中显示模式窗体一节中找到
其意思是让dll中的模式窗体在显示时不出现在任务栏上,只出现本工程的。
如果不写这句话则模式窗体和本工程都会出现在任务栏上。
 
详细点是啥错误,我也上这样的没错呀
我用D5
 
注意调用时,是否也使用了声明时的stdcall方式传递参数,这是使用DLL经常会出现的问题。
Delphi缺省将使用register方式
 
uses sharemem;[:)]
 
DLl调用共有四种指示字:
Register:默认,是唯一使用CPU寄存器的参数传递方式,也是传递速度最快的方式;
PasCal:调用协议仅用于向后兼容,则向旧版本兼容;
CdCall:用于需要由调用者清除参数的例程;
SafeCall和StdCall:主要用于调用WinAPI函数;

还有要注意不同的调用协议,对Dll所在目录与调用者所在目录之间的关系敏感的,
如,有的协议要求放在Window的system下;
 
调用之前dll和调用程式都重新编译一下
 
frmAbount:=TfrmAbount.create(Application)
 
多人接受答案了。
 
后退
顶部