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这个值并没有初始化.
如果要共享这个值,可以用内存映射文件,如果是通知某个程序,可以广播注册的自定义消息,或者查找窗口发送自定义消息