//64位的DLL
BOOL APIENTRY DllMain( HMODULE hModule,
  DWORD  ul_reason_for_call,
  LPVOID lpReserved
  )
{
if (DLL_PROCESS_ATTACH==ul_reason_for_call)//32位的EXE进程是不会进入这里的
{
char szPID[1024] = {0};
sprintf(szPID, "PID:%d(In DllMain)", GetCurrentProcessId());
OutputDebugString(szPID);
}
return TRUE;
}
//32位、64位的EXE都会进入这里的,即使EXE没有进入DllMain
LRESULT CALLBACK CSecureCRTAudit::KeyboardProc(
  int code,       // hook code
  WPARAM wParam,  // virtual-key code
  LPARAM lParam   // keystroke-message information
  )
{
                char szPID[1024] = {0};
sprintf(szPID, "PID:%d(In KeyboardProc)", GetCurrentProcessId());
OutputDebugString(szPID);
}在64位系统下安装64位全局DLL键盘钩子,所有的32位程序第一次促发键盘事件时不会调用我的DllMain,而是会直接进入KeyboardProc,所以钩子虽然安装成功了,但是在DllMain中的初始化工作未必都能完成。32位的全局DLL键盘钩子安装在64位的系统下也会出现类似的问题。64位的EXE只能调用64位的DLL,32位的EXE只能调用32位的DLL,安装Widnows钩子的时候相关EXE会加载DLL,即使没有进入DllMain,也会照样执行钩子函数的。

解决方案 »

  1.   

    不使用 OutputDebugString,使用自己实现的文件输出代码试一试呢?
      

  2.   

    你难道不可以将程序都编译成64位的吗?大部分API中32位和64位没太大区别(个别系统方面接口的API可能有些不同)
      

  3.   

    可以用32位的DLL在64位系统上安装Windows钩子,但是所有64位的程序都不会加载这个32位的DLL钩子
      

  4.   

    这是操作系统限制,对应版本的Exe只能加载对应的dll。你需要用两个勾子,或者直接用驱动!
      

  5.   

    蛋疼了, 我用64位的exe loadlibrary("dll"); dll也是64位的 加载时可以,也达到了hook的效果但freelibrary的时候就报错!堆栈不平衡了。
              case DLL_PROCESS_ATTACH:
                  HookApi();
    break;
    case DLL_PROCESS_DETACH: //进程卸载Dll
    UnHookApi();
                  break;