下面是一个远程注入其他进程的DLL中定时器创建代码.该DLL被注入后会在DLLMAIN内调用CreateTimer创建定时器.如果去掉注释的那段代码.TimerDo回调函数不会被执行;如果加上那段代码,TimerDo会被执行但DLL所在的程序陷入假死状态,请高手加以指点该现象的解决办法和远程注入中定时器的使用问题.
procedure TimerDo(hWnd: HWND; uMsg: UINT; idEvent: UINT; dwTime: DWORD); stdcall;
begin
  .......Logout
end;procedure CreateTimer;
var
  Msg: TMsg;
begin
  iTimerID := SetTimer(0, 0, 3000, @TimerDo); 
  //while GetMessage(Msg, 0, 0, 0) do
  //begin
  //DispatchMessage(Msg); //创建windows消息循环
  // Application.ProcessMessages;
 //end;
end;

解决方案 »

  1.   

    SetTimer不是线程的...
    你的Application.ProcessMessages;根本不会起作用...
      

  2.   

    死循环。被注入的程序再也不会被执行了。解决办法:不要用Timer,另建一个线程来做你想做的事。
      

  3.   

    我用TimeSetEvent可以完美解决DLL定时器的问题,但为什么SetTimer会出现上面那种现象..没人可以解答?
      

  4.   

    SetTimer(ZTHandle, 0, 100, @LoninZT);
    我100都不会有这种现象
    我不知道你的过程怎么写
    但是我可以告诉你怎么写就不会有假死
    在我的LoninZT过程中创建窗体
    如果没有创建就建新窗体
    创建了就不理,让它在那走着我的程序在<征途>测试过,512M内存,P4 2.4G的机器很快