读书人

动态调用DLL出错请教错在那里

发布时间: 2012-02-08 19:52:21 作者: rapoo

动态调用DLL出错,请问错在那里?
这是DLL的写法
procedure MyShowMessage(AStr:string);stdcall;
begin
try
FormDialog:=TFormDialog.Create(Application);
FormDialog.lbl1.Caption:=AStr;
if FormDialog.ModalResult = mrok then
begin

end;
FormDialog.ShowModal;
finally
FormDialog.Free;
end;
end;

exports
MyShowMessage;


这是动态调用的写法
procedure TFormMain.btn1Click(Sender: TObject);
var
AHandle:THandle;
AMyShowMessage:TMyShowMessage;
begin
try
AHandle:=LoadLibrary('DTDll.dll');
if AHandle <> 0 then
begin
@AMyShowMessage:=GetProcAddress(AHandle,'MyShowMessage');
if @AMyShowMessage <> nil then
begin
AMyShowMessage('hi dll!');
end
else
begin
ShowMessage('No get it!');
end;
end;
finally
FreeLibrary(AHandle);
end;
end;
一是没有显示我想要的'hi dll!'而是显示了'X?',接着就是连是程序都关闭了。
请问错在那里?
而同一个DLL,静态调用则没有任何问题哦。

静态调用如下
var
FormMain: TFormMain;
procedure MyShowMessage(AStr:string);stdcall; external 'DTDll.dll';

...

procedure TFormMain.btn2Click(Sender: TObject);
begin
MyShowMessage('hi dll!');
end;





[解决办法]
没测试,你把string改成pchar
[解决办法]
动态调用的写法
procedure TFormMain.btn1Click(Sender: TObject);
var
AHandle:THandle;
AMyShowMessage: procedure (AStr:string);stdcall;
begin
try
AHandle:=LoadLibrary('DTDll.dll');
if AHandle <> 0 then
begin
@AMyShowMessage:=GetProcAddress(AHandle,'MyShowMessage');
if @AMyShowMessage <> nil then
begin
AMyShowMessage('hi dll!');
end
else
begin
ShowMessage('No get it!');
end;
end;
finally
FreeLibrary(AHandle);
end;
end;

读书人网 >.NET

热点推荐