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,
……
{
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,
……
求解释
求解释
如果要通过设置共享数据段与宿主进程通讯,肯定不能马上FreeLibrary
功能可以正常运行的……
LoadLibrary 分配的那个只是挂钩接口SetHookEx而已
LoadLibrary 分配的那个只是挂钩接口SetHookEx而已
LoadLibrary 分配的那个只是挂钩接口SetHookEx而已