无法理解,我是搞不懂了。关于dll调用的问题

caochao0902 2003-08-20 02:38:16
我写了一个dll,如下:
library DllDemo;

uses
ShareMem,
SysUtils,
Forms,
WIndows,

Classes,
calc in 'calc.pas',
Unitform1 in 'Unitform1.pas' {Form2};

var
DllApplication: TApplication;
{$R *.res}

procedure DLLUnloadProc(Reason: Integer); register;
begin
if Reason = DLL_PROCESS_DETACH then Application := DllApplication;
end;

procedure CreateChild(AHandle: THandle); stdcall;
begin
Application.Handle:= AHandle;
try
Form2:= TForm2.Create(Application);
Form2.ShowModal;
except
Form2.Free;
end;
end;

exports CreateChild;

begin
DllApplication := Application;
DLLProc := @DLLUnloadProc;
end.

调用方法如下:
procedure TForm1.Button1Click(Sender: TObject);
var
HInst:THandle;
MyFunc:TAdd;
begin
HInst:=LoadLibrary(DllName); //调用DLL
if HInst>0 then //如果成功
try
@MyFunc:=GetProcAddress(HInst,PChar('CreateChild')); //获得函数地址
if @MyFunc<>nil then
begin
MyFunc(Application.Handle);
end
else
messagebox(0,'Funtion Add not found','Warning',MB_OK);
finally
FreeLibrary(HInst);
end
else
messagebox(0,'DllName not found','Warning',MB_OK);
end;

我就搞不懂啊,一调用就出现内存地址错误。我看好多地方的例子就这样子写的啊!为什么会这样?
...全文
54 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
swayi21 2003-08-21
  • 打赏
  • 举报
回复
PS:
ShareMem unit is not necessary until you are using string type.

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......
swayi21 2003-08-21
  • 打赏
  • 举报
回复
PS:
ShareMem unit is not necessary until you are using string type.
swayi21 2003-08-21
  • 打赏
  • 举报
回复
procedure CreateChild(AHandle: THandle); stdcall;
begin
Application.Handle:= AHandle;

Form2:= TForm2.Create(Application); // Pay more attention to here.

try
Form2.ShowModal;
except
Form2.Free;
end;
end;
mj_hc 2003-08-20
  • 打赏
  • 举报
回复
我的是delphi6 ,我想还是“stdcall”,dll里面的定义和调用程序里的申明都需要stdcall,其它没什么问题。(还有调用函数里定义 DllName:pchar='DllDemo.dll');
现在搞定没有?
caochao0902 2003-08-20
  • 打赏
  • 举报
回复
没人看得出错误在哪里?
caochao0902 2003-08-20
  • 打赏
  • 举报
回复
各位老大,有何高见啊?
caochao0902 2003-08-20
  • 打赏
  • 举报
回复
这么个简单的东西搞了我一天了,何时才是个尽头啊
lxpbuaa 2003-08-20
  • 打赏
  • 举报
回复
再弄了一下,2所说的内容的确可以去掉,没有问题。因为dll和调用者是同一个进程,Application是共享的,不过刚才运行时居然有问题,奇怪啊奇怪……

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
Soft001 2003-08-20
  • 打赏
  • 举报
回复
gz
caochao0902 2003-08-20
  • 打赏
  • 举报
回复
我当然用了stdcall,绝对没错,请问mj_hc你的编译器环境是什么?
lxpbuaa 2003-08-20
  • 打赏
  • 举报
回复
对了,如果去掉上面2所说的内容,Form1就没有了拥有窗口,还是保留吧,按照1说的将ShareMem加到工程文件的Uses部分第一位置。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
lxpbuaa 2003-08-20
  • 打赏
  • 举报
回复
对了,如果去掉上面2所说的内容,Form1就没有了拥有窗口,还是保留吧,按照1说的将ShareMem加到工程文件的Uses部分第一位置。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
caochao0902 2003-08-20
  • 打赏
  • 举报
回复
似乎都解决不了问题啊。
mj_hc 2003-08-20
  • 打赏
  • 举报
回复
我完全用你的代码试了下没问题的
很正常的就把dll里的form2调出来了
你调用程序前面的申明是不是这样的: TAdd=procedure(d:integer);stdcall;
注意“stdcall”!


zjybestzjybest 2003-08-20
  • 打赏
  • 举报
回复
procedure DLLUnloadProc(Reason: Integer); stdcall;
procedure CreateChild(AHandle: THandle); stdcall;
begin
Application.Handle:= AHandle;
try
Form2:= TForm2.Create(Application);
Form2.ShowModal;
finally //except
Form2.Free;
end;
end;
lxpbuaa 2003-08-20
  • 打赏
  • 举报
回复
主要的问题有:
1、调用程序的工程文件中的Uses部分的第一个单元应该是ShareMem。选择菜单Project->View Source,然后修改。
2、你定义那个DllApplication没有必要。因此DllApplication和DLLUnloadProc都可以删除,CreateChild中的Application.Handle:= AHandle;也可以去掉。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
caochao0902 2003-08-20
  • 打赏
  • 举报
回复
我也实在找不出什么错误了,我看所有的地方都是这么写的啊
既然程序没问题,难道我的编译器不对?我用delphi6然后打了pack2,应该可以了啊
mj_hc 2003-08-20
  • 打赏
  • 举报
回复
我试了下没问题阿
很正常的就把dll里的form2调出来了
你调用程序前面的申明是不是这样的: TAdd=procedure(d:integer);stdcall;
skylimz 2003-08-20
  • 打赏
  • 举报
回复
没发现什么错误~~
应该是自己水平太差,帮不上你了
sixgj 2003-08-20
  • 打赏
  • 举报
回复
呵呵。那可真是难找……

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧