首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

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

2012-02-08 
动态调用DLL出错,请问错在那里?这是DLL的写法procedure MyShowMessage(AStr:string)stdcallbegintryForm

动态调用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;

热点排行