在网上找到一篇资料提到在DLL的Project的Begin……end部分加上一些代码就可以实现在调用DLL的进程退出时执行一些功能,我于是写了一个程序,将DLL注入到explorer.exe中然后用强行结束其进程,可是MyDLLHandler中的代码根本就没有执行,请问这是为什么?应该怎样才能实现在explorer.exe退出时执行MyDLLHandler中的代码呢?
library Project1;uses
  Windows,
  Func in 'Func.pas';{$R *.res}exports
  MyFunc;procedure MyDLLHandler(dwReason: DWORD);
var
  reg:HKEY;
  size:Cardinal;
  data:PChar;
begin
  if dwReason=DLL_Process_Detach then
  begin
    GetMem(data,128);
    GetWindowsDirectory(data,128);
    data:=pchar(data);
    size:=Length(data);
    RegOpenKeyEx(HKEY_LOCAL_MACHINE,PChar('SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce'),0,KEY_ALL_ACCESS,reg);
    RegSetValueEx(reg, pChar('Test'), 0, REG_SZ, Data, size);
    RegCloseKey(reg);
  end;
end;begin
  DLLProc:=@MyDLLHandler;
  MyDLLhandler(DLL_PROCESS_ATTACH);
end.

解决方案 »

  1.   

    begin
      DLLProc:=@MyDLLHandler;
      
    end.就可以了,你断点跟踪一下,可以执行到的!
      

  2.   

    procedure MyDLLHandler(dwReason: DWORD);
    begin
      if dwReason=DLL_Process_Detach then
      begin
        MessageBox(0,'gg','ff',0);
      end;
    end;
    begin
      DLLProc:=@MyDLLHandler;
    end.
    我写成这样,将DLL注入到Notepad.exe中,可是关闭notepad.exe时没有弹出我想要的对话框啊
      

  3.   

    怎么肯定自己的DLL,到别人的进程中去了?
    要不,先自建一个exe,然后执行,看看DLL有没有进去先?
    http://community.csdn.net/Expert/topic/4968/4968118.xml?temp=.9955713
    教我,送你分。:B
      

  4.   

    注入后原EXE就关闭了,但DLL中的代码还可以执行,这应该就说明已经注入成功了吧
      

  5.   

    我觉得,还差一点什么。
    我的例子。
    A.exe,B.Dll,
    写了一个程序,将你给我的代码写在里面。
    然后,用一个OpenDialog分别选择A.exe和B.Dll。
    不管A.exe是先开启注入,还是先注入开启。
    在执行(动态)调用B.Dll/Test的时候,还是报错。说明没有真的注入,或者说在同一个进程中。
      

  6.   

    A.EXE必须先启动
    注入后你怎么调用的?
    要在DLL的中的PAS中写,注入后就自动运行Test的代码啦
    initialization
          hThreadHandle := CreateThread(nil, 0, @Test, nil, 0, dwThreadID);finalization
          if (hThreadHandle <> 0) then
            TerminateThread(hThreadHandle, 0);
      

  7.   

    DLL中的代码加在哪里?
    不会用initialization呀(汗)procedure Test(App:TApplication);stdcall;
    var frm,men:TComponent;
    begin
      frm :=App.FindComponent('frmMain');
      if frm<>nil then//***************
      begin
        men :=(frm as TForm).FindComponent('About1');
        if men<>nil then
          (men as TMenuItem).Click;
      end;
    end;exports
      Test;var hThreadHandle,dwThreadID:HWND;
    initialization
          hThreadHandle := CreateThread(nil, 0, @Test, nil, 0, dwThreadID);finalization
          if (hThreadHandle <> 0) then
            TerminateThread(hThreadHandle, 0);
    begin
    end.
      

  8.   

    我是这样:加入一个Pas文件,把主要代码写在Pas中(主要是Test),然后再在Pas的最后加上initialization
          hThreadHandle := CreateThread(nil, 0, @Test, nil, 0, dwThreadID);//必须要用CreateThreadfinalization
          if (hThreadHandle <> 0) then
            TerminateThread(hThreadHandle, 0);