为何我的钩子第一次无法执行?

tuiger2003 2003-03-04 12:39:08
各位高手:

  我设计了一个全局钩子DLL,并将其在w2k下设成了服务程序,可出现两个问题
1、设为服务程序后,如果马上运行该程序,整个系统变得非常慢,可如果重启系统以后,系统运行速度恢复正常。这一点还好说,重启一下呗。
2、服务程序启起来后,钩子根本未工作。但是我手工再运行一下这个程序,钩子就完全正常了。真搞不懂这是为啥?
...全文
35 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tuiger2003 2003-06-05
  • 打赏
  • 举报
回复
谢谢你,我已经发信给你了 :)
funcy333 2003-06-05
  • 打赏
  • 举报
回复
还是窗口类的句柄问题,你不要设成win32 application,源代码我可以提供,我的邮箱是funcy333@hotmail.com
tuiger2003 2003-03-05
  • 打赏
  • 举报
回复
至于Hookproc的实现是截获message里需要的东西。
在service程序里只用了一个loadlibrary(...),因为在dll的初始化中已经进行了HookInstaller(),loadlibrary后钩子就挂上了。(见上程序)
tuiger2003 2003-03-05
  • 打赏
  • 举报
回复
.........
static AFX_EXTENSION_MODULE HookDllDLL = { NULL, NULL };

#pragma data_seg("SharedDataName")
HHOOK hHookMsg=0;
HHOOK hHookProc=0;
HINSTANCE hinst=0;
HWND hHandleWnd=0;
#pragma data_seg()
extern "C" _declspec(dllexport) BOOL HookInstaller();
extern "C" _declspec(dllexport) BOOL HookUninstaller();
extern "C" _declspec(dllexport)LRESULT WINAPI CallMsgProc(int nCode,WPARAM wParam,LPARAM lParam);
extern "C" _declspec(dllexport)LRESULT WINAPI CallWndProc(int nCode,WPARAM wParam,LPARAM lParam);
BOOL WINAPI HookProc(HWND hwnd,UINT uiMessage,WPARAM wParam,LPARAM lParam);

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
UNREFERENCED_PARAMETER(lpReserved);
str_Buff_Size = GetWindowsDirectory(str_Buff,MAX_LEN);
strcat(str_Buff,TEMP_FILE_NAME);
strFileName = str_Buff;
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("HOOKDLL.DLL Initializing!\n");
if (!AfxInitExtensionModule(HookDllDLL, hInstance))
return 0;
numbers++;
if(numbers==1&&phook==0)
{
hinst=hInstance;
HookInstaller();
}
new CDynLinkLibrary(HookDllDLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("HOOKDLL.DLL Terminating!\n");
numbers--;
if(numbers==0&&phook)
{
HookUninstaller();
phook=0;
}
AfxTermExtensionModule(HookDllDLL);
}
return 1; // ok
}

BOOL HookInstaller()
{
//CString SaveInfo1="";
//CString strFileName1="";
if((hHookMsg=SetWindowsHookEx(WH_GETMESSAGE,CallMsgProc,hinst,0))!=NULL
&&(hHookProc=SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc,hinst,0))!=NULL)
return true;
return false;
}

BOOL HookUninstaller()
{
BOOL bUninstall;
if(hHookMsg)
{
bUninstall=UnhookWindowsHookEx(hHookMsg);
if(bUninstall)
{
hHookMsg=NULL;
bUninstall=UnhookWindowsHookEx(hHookProc);
if(bUninstall)
{
hHandleWnd=NULL;
hHookProc=NULL;
}
}
}
return bUninstall;
}

extern "C" _declspec(dllexport)LRESULT WINAPI CallMsgProc(int nCode,WPARAM wParam,LPARAM lParam)
{
PMSG pMsg=(MSG*)lParam;
if(nCode>=0&&pMsg&&pMsg->hwnd)
{
HookProc(pMsg->hwnd,pMsg->message,pMsg->wParam,pMsg->lParam);
}
return CallNextHookEx(hHookMsg,nCode,wParam,lParam);
}

extern "C" _declspec(dllexport)LRESULT WINAPI CallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
{
PCWPSTRUCT pCwps;
pCwps = (PCWPSTRUCT)lParam;
if (nCode>=0&&pCwps && pCwps->hwnd)
{
HookProc(pCwps->hwnd, pCwps->message, pCwps->wParam, pCwps->lParam);
}

return CallNextHookEx(hHookProc, nCode, wParam, lParam);
}
yangsiwei 2003-03-05
  • 打赏
  • 举报
回复
你是什么钩子,怎么实现的,说明白点呀
tuiger2003 2003-03-05
  • 打赏
  • 举报
回复
钩子第一次挂变慢的问题解决了,是我自已程序的问题。但为啥第一次挂不上的问题还是不清楚!
tuiger2003 2003-03-04
  • 打赏
  • 举报
回复
另外,我的钩子程序在有的w2k机器上运行一次就起来了,有的机器却要两次,这又是为啥?
我钩子DLL中的共享变量是这样写的:
#pragma data_seg("SharedDataName")
HHOOK hHookMsg=0;
HHOOK hHookProc=0;
HINSTANCE hinst=0;
HWND hHandleWnd=0;
#pragma data_seg()
Daniel22_cn 2003-03-04
  • 打赏
  • 举报
回复
gz..........
tuiger2003 2003-03-04
  • 打赏
  • 举报
回复
我可以肯定钩子挂上了,因为我想删除这个dll, 可系统提示这个文件正被占用。可为什么第一次不工作呢?

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧