下面的函数都在一个dll中实现 //通过内存地址取得模块句柄
 HMODULE   ModuleFromAddress(PVOID   pv)   
{   
  MEMORY_BASIC_INFORMATION mbi;   
  if (VirtualQuery(pv,&mbi,sizeof(mbi))!=   0)  
   {
return (HMODULE)mbi.AllocationBase ;
   
   }   
  else
         return NULL;
}
       
  ////////////////////////////////////////////////////////////  
//dll导出函数
  BOOL   WINAPI   SetKeyHook(BOOL   bInstall,   DWORD   dwThreadId,,HWND hWnd)   
  {   
        BOOL bOK;
      if(bInstall)   
      {   
 
          g_hhook   =   SetWindowsHookEx(WM_KEYBOARD,KeyHookProc,ModuleFromAddres(KeyHookProc),dwThreadId);  
          bOK=(g_hook!=NULL);
       }
      else
      {
 bOk = ::UnhookWindowsHookEx(g_hHook);
          g_hHook = NULL;
       }
  
       return bOK;
 }
注:KeyHookProc是钩子函数名,它的实现未写出我的问题是:为了设置全局钩子,SetWindowsHookEx的第三个函数为该钩子所在dll的实例句柄,
为什么将钩子函数的地址代人VirtualQuery(pv,&mbi,sizeof(mbi))后,mbi.AllocationBase的就是dll模块的实例句柄?

解决方案 »

  1.   

    dll的句柄就是它在内存中的起始地址。把钩子函数地址代入可以查到钩子函数所在的由virtualalloc分配的内存的起始地址,这片内存是系统在加载dll时分配的。
      

  2.   

    那将导入函数的SetKeyHook地址代入,是不是也能得到dll的句柄
      

  3.   

    就是将ModuleFromAddres(KeyHookProc)改为
    ModuleFromAddres(SetKeyHook)