test.dll 中 SetHookEx 接口HHOOK SetHookEx(HWND hWnd,int nType)   
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());  
if(hWnd == NULL)
{
LOG_ERROR(_T("句柄为空\r\n"));
return NULL;
}
HHOOK hHook = NULL;
DWORD dwThreadID = GetWindowThreadProcessId( hWnd, NULL );
//WH_GETMESSAGE
switch(nType)
{
case 0:
case 1:
case 2:
case 3:
case 4://
{
hHook = ::SetWindowsHookEx(WH_GETMESSAGE,HookGetMsgProc,hInst,dwThreadID);
if (hHook == NULL)
{
DWORD dwError = GetLastError(); 
CString str;
str.Format(_T("WH_GETMESSAGE%d-dwError:%d\r\n"),nType,dwError);
LOG_ERROR(str);
}
else
{
g_hMsgHook[nType] = hHook;
//WH_CALLWNDPROC
HHOOK hCallWndProHook = ::SetWindowsHookEx(WH_CALLWNDPROC,HookCallWndProc,hInst,dwThreadID);
if (hCallWndProHook == NULL)
{
DWORD dwError = GetLastError(); 
CString str;
str.Format(_T("WH_CALLWNDPROC%d-dwError:%d\r\n"),nType,dwError);
LOG_ERROR(str);
}
else
{
g_hCallHook[nType] = hCallWndProHook;
}
}
}
break;
default:
break;
} return hHook;
}  
调用HHOOK SetHook(HWND ThreadId,int nType)
{
// TODO: 在此添加控件通知处理程序代码
TCHAR szFilePath[MAX_PATH] = {0};
_tcscpy(szFilePath,g_strAppPath);
_tcscat(szFilePath,_T("\\test.dll"));
//
LPSETHOOK lproc; 
HHOOK hHook = NULL;
HANDLE hDll = NULL; 
BOOL bRet = TRUE; 
PROCESS_INFORMATION info; 
STARTUPINFO start;  //memset(&start, 0, sizeof(start)); 
ZeroMemory(&start,sizeof(start));
start.cb = sizeof(start);
ZeroMemory(&info,sizeof(info)); hDll = LoadLibrary(szFilePath); 
if (hDll != NULL) 

lproc = (LPSETHOOK)GetProcAddress((HMODULE)hDll,"SetHookEx"); 
if (lproc != NULL) 

hHook = (*lproc)(ThreadId,nType);

FreeLibrary((HMODULE)hDll);

return hHook;
}
调用了test.dll 里的SetHookEx接口 LoadLibrary 后 得到SetHookEx接口运行 然后马上FreeLibrary
这样钩子有挂接成功,但是看到很多例子LoadLibrary 没有马上FreeLibrary 而是等待卸载钩子的时候
再FreeLibrary,
……

解决方案 »

  1.   

    调用dll 挂钩接口后,需要马上FreeLibrary吗?
    求解释
      

  2.   

    调用dll 挂钩接口后,需要马上FreeLibrary吗?
    求解释
      

  3.   

    应该是不可以的,你挂载成功后运行过这个钩子的功能没?毕竟这个是用指针函数的。LoadLibrary给分配个虚地址,然后运行到了还是要到DLL里面执行的。
      

  4.   

    不需要。系统对DLL的管理和管理其他内核对象一样,都有一个引用计数。
      

  5.   

    不需要,程序结束后会自动FreeLibrary
    如果要通过设置共享数据段与宿主进程通讯,肯定不能马上FreeLibrary
      

  6.   


    功能可以正常运行的……
    LoadLibrary 分配的那个只是挂钩接口SetHookEx而已
      

  7.   

    功能可以正常运行的……
    LoadLibrary 分配的那个只是挂钩接口SetHookEx而已
      

  8.   

    功能可以正常运行的……
    LoadLibrary 分配的那个只是挂钩接口SetHookEx而已