我写了一个DLL,只有一个导出函数Start,我在注册表RUN键里增加了一个值 rundll32 ...\myDll.dll,Start  来计算机启动时运行我的DLL。
extern "C" int __stdcall Start()
{
   if(! InstallFilter(TRUE))       //安装钩子
   return 0;
WaitForSingleObject(stopEvent.m_hObject,INFINITE);  //一直等到钩子卸载
return 1;
}BOOL  InstallFilter(BOOL bInstall)
{
if(bInstall)
{
     hHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)   CallBackProc,theApp.m_hInstance,0); 
 myFile.Open     (FPATH,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite|CFile::shareDenyNone );
if(hHook)
{
   stopEvent.ResetEvent();
return TRUE;
} }
else
{
if(UnhookWindowsHookEx(hHook))
{
myFile.Close();
stopEvent.SetEvent();
return TRUE;
}
}
return FALSE;
}
现在已经能捕获键盘事件了,可是当我按F12(我设的)就卸载钩子,但执行到UnHookWindowsHook 的时候却失败了(返回FALSE),导致不能退出,大家给看看啊

解决方案 »

  1.   

    用GetLastError()函数看看,是什么原因?
      

  2.   

    1404 Invalid hook handle.  ERROR_INVALID_HOOK_HANDLE 
    嗯。1404表示你的hook句柄已经无效了。
      

  3.   

    hHook的定义在哪里啊?
    还有别的地方进行释放么?
      

  4.   

    无效的挂钩句柄。
    那么,就是说hHook只有问题。
    你应该把hHook值放到共享节中。
    #pragma  data_seg(".myshare") 
    HHOOK  hHook = NULL;  
    #pragma  data_seg()
    #pragma  comment(linker,"/section:.myshare,rws")
      

  5.   

    hHook 我定义的全局变量啊
    static HHOOK hHook;
      

  6.   

    不可以,因为你的中止不一定在你的起始程序,所以要用共享节。
    把hHook的声明放到共享节中,用下面的代码:
    #pragma  data_seg(".myshare") 
    HHOOK  hHook = NULL;  
    #pragma  data_seg()
    #pragma  comment(linker,"/section:.myshare,rws")
      

  7.   

    要不你把源代码发到我邮箱看看:JujoKing@hotmail.com
      

  8.   

    累死我了,汗终于找到原因了。
    你的代码中的错误不少啊。
    1.CEvent也要放到共享节中
    #pragma  data_seg(".myshare") 
    CEvent  stopEvent;
    HHOOK hHook = NULL; 
    #pragma  data_seg()
    #pragma  comment(linker,"/section:.myshare,rws")
    2.不能在钩子函数体内卸载钩子。
    所以你必须也把InstallFilter导出,然后在用Rundll32执行卸载函数。
    具体原因是因为钩子过程在运行的时候认为hHook是空的局部变量,用SoftIce调试的时候可以看到。原来我用VC一直调试不进去,最后愤怒了,用SoftIce调试真它的麻烦。
      

  9.   

    路过
    顺便问问wangk(倒之) ( ),你用SoftIce怎么调试的?介绍介绍    :)
    需要加在Symbol file么?
      

  10.   

    刚刚写汇编时遇到一样的问题,学习了。用 software 调试,电脑想死机了一样,用ctrl+alt+del屏蔽了消息才看到对话框
      

  11.   

    看了,但是我写的是日记钩子,没有用dll,无需共享啊。