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

DLL回调函数,无法正常调用,不知道哪出错了[100分求解]解决思路

2012-02-08 
DLL回调函数,无法正常调用,不知道哪出错了[100分求解]//-----------DPR----------unit test..........typ

DLL回调函数,无法正常调用,不知道哪出错了[100分求解]
//-----------DPR----------
unit test;
..........
type
  TTerminalProc=Procedure();stdcall;
...
var
  Form1: TForm1;
  procedure StartT(TerminalProc:TTerminalProc); stdcall; external 'testdll.dll';
.......
procedure TerminalProc();stdcall;
begin
  ShowMessage('回调');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  StartT(@TerminalProc);
end;



//--------------DLL--------------
library testdll;
........
type
  TTerminalProc = procedure(); stdcall;
...
var
  dllTerminalProc:TTerminalProc;
........
procedure StartT(TerminalProc:TTerminalProc); stdcall;
begin
  dllTerminalProc:=TerminalProc;
  if Assigned(dllTerminalProc) then dllTerminalProc;//此时调用显示'回调'提示
  ..................
end;

..................
//下面这个函数是由其它事件触发的
procedure ActNow();stdcall;
begin
  if Assigned(dllTerminalProc) then dllTerminalProc;//此时调用不会显示'回调'提示
end;


exports
  StartT;




[解决办法]
我测试没问题,你的ActNow是怎样触发的?
在你ActNow触发前,必须调用StartT,否则是不可能显示'回调'的
[解决办法]
关键是ActNow是怎样触发的,我直接导出它,然后起接调用是可以的,当然你要保证StarT和ActNow是在同一进程中,否则也不能调用的
delphi自己调用自己的DLL是可以单步调试的,跟踪一下程序看看

[解决办法]
你 这个问题应该是你在调用dllTerminalProc之前应用程序已经开始销毁,并且你的那个指针的原方法所在的类被释放造成的。
[解决办法]
你只提供了部分源码,大伙看不出来你是否调用出错了
[解决办法]
>>当有人想结束任务的时候,dll通过回调函数通知主程序.

注意,用HOOK把DLL映射到其它进程的空间后,虽然DLL是一份,但里面的变量是不共享的,即在你注入的进程里,dllTerminalProc这个值并没有初始化.

如果要共享这个值,可以用内存映射文件,如果是通知某个程序,可以广播注册的自定义消息,或者查找窗口发送自定义消息

热点排行