//-----------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;

解决方案 »

  1.   

    我测试没问题,你的ActNow是怎样触发的?
    在你ActNow触发前,必须调用StartT,否则是不可能显示'回调'的
      

  2.   

    触发前StarT调用过了的,在ActNow里调用回调函数,报:0x00000000内存不能为Read....
      

  3.   

    关键是ActNow是怎样触发的,我直接导出它,然后起接调用是可以的,当然你要保证StarT和ActNow是在同一进程中,否则也不能调用的
    delphi自己调用自己的DLL是可以单步调试的,跟踪一下程序看看
      

  4.   

    你 这个问题应该是你在调用dllTerminalProc之前应用程序已经开始销毁,并且你的那个指针的原方法所在的类被释放造成的。
      

  5.   

    这个是网上下的HookApihttp://download.csdn.net/source/2189303我想改改,当有人想结束任务的时候,dll通过回调函数通知主程序.
      

  6.   

    UP,好象Hook了OpenProcess,帮忙把源码下下去研究下
      

  7.   

    >>当有人想结束任务的时候,dll通过回调函数通知主程序.注意,用HOOK把DLL映射到其它进程的空间后,虽然DLL是一份,但里面的变量是不共享的,即在你注入的进程里,dllTerminalProc这个值并没有初始化.如果要共享这个值,可以用内存映射文件,如果是通知某个程序,可以广播注册的自定义消息,或者查找窗口发送自定义消息
      

  8.   

    回调ActNow的时候,应该是dllTerminalProc方法已经销毁,检查一下
      

  9.   

    如果只是调用主程序函数
    dllTerminalProc:TTerminalProc; 这个完全多余的, procedure StartT(TerminalProc:TTerminalProc);
    begin
    if Assigned(TerminalProc) then TerminalProc;//此时调用显示'回调'提示
    end;TerminalProc你能确保它不报错?