钩子安装失败,SetWindowsHookEx返回值0

xiaohaofancy 2010-05-21 10:35:35
我基本是按照vc++深入详解写的,在实验室机器上没错误,可回家就错
哪位高人能指点下,我实在是搞不明白到底哪里错了?
截取了部分代码如下:

HMODULE h=GetModuleHandle("dll_pocket");
PROC p=GetProcAddress(h,"GetMsgProc");
HHOOK g_hhook = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,h,dwThreadId);
DWORD error=GetLastError();

调试时:
h值为0x10000000(GetProcAddress调用成功是不是说明h值正确)
p值为0x10001005(说明GetMsgProc也正确)
dwThreadId值为2948(我在任务管理器核对过,是正确的)
g_hhook值为0x00000000(所有参数都是正确的,为什么会返回0)
error值为87

整个dll如下所示:(dll工程名为dll_pocket)

#define DLLPOCKET_EXPORT extern "C" _declspec(dllexport)
#include "dllpocket.h"

#pragma data_seg("Shared")
HHOOK g_hhook = NULL;
#pragma data_seg()
#pragma comment(linker, "/Section:Shared,rws")

LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam) {
MSG *msg=(MSG*)wParam;
if(msg.message==WM_LBUTTONDOWN)
::PostMessage(FindWindow(NULL,"pocket"),WM_USER+1,msg->wParam,msg->lParam);
return(CallNextHookEx(g_hhook, code, wParam, lParam));
}

DLLPOCKET_EXPORT BOOL WINAPI HookApp(BOOL fInstall, DWORD dwThreadId) {
BOOL fOk;
if (fInstall) {
if(g_hhook!=NULL)
return FALSE;
// Install the Windows' hook
HMODULE h=GetModuleHandle("dll_pocket");
PROC p=GetProcAddress(h,"GetMsgProc");
g_hhook = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,h,dwThreadId);
DWORD error=GetLastError();
fOk = (g_hhook != NULL);
}
else
{
if(g_hhook==NULL)
return FALSE;
fOk = UnhookWindowsHookEx(g_hhook);
g_hhook = NULL;
}
return(fOk);
}
...全文
829 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohaofancy 2010-05-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fishion 的回复:]
HMODULE h=GetModuleHandle("dll_pocket");
HOOKPROC p=(HOOKPROC)GetProcAddress(h,"GetMsgProc");
HHOOK g_hhook = SetWindowsHookEx(WH_GETMESSAGE,p,h,0);
[/Quote]

一样的,这么写和直接写函数名都一样。
仍然是我说的,指定进程ID的时候返回0,
dwThreadId=0的时候能正常执行。。。
xiaohaofancy 2010-05-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cnzdgs 的回复:]
如果线程ID给0可以正常,说明你给的线程ID有问题。该成用FindWindow、GetWindowThreadProcessId莱获取线程ID试试。
[/Quote]

结贴:找到原因了,果然是线程id弄错了。
应该是id=GetWindowThreadProcessId(hwnd,NULL);
我写成GetWindowThreadProcessId(hwnd,&id);
两者获得的id是不一样的,恨。。。
cnzdgs 2010-05-22
  • 打赏
  • 举报
回复
如果线程ID给0可以正常,说明你给的线程ID有问题。该成用FindWindow、GetWindowThreadProcessId莱获取线程ID试试。
xiaohaofancy 2010-05-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cnzdgs 的回复:]
如果线程ID给0可以正常,说明你给的线程ID有问题。该成用FindWindow、GetWindowThreadProcessId莱获取线程ID试试。
[/Quote]

我就是用这个方法获得的,而且我用任务管理器核对过,id是正确的。

另外,今天我又用windows核心编程的源码试了一下,人家的钩子可以安装成功,说明不是系统的事情
还是我程序不知道哪里有问题。。。
mcaok 2010-05-22
  • 打赏
  • 举报
回复
顶一下。
xiaohaofancy 2010-05-22
  • 打赏
  • 举报
回复
补充:不让挂接到指定的进程是不是因为我机器安装了360,还有杀毒软件?
因为我实验室的机器什么都没安装,就可以挂接。
fishion 2010-05-21
  • 打赏
  • 举报
回复
HMODULE h=GetModuleHandle("dll_pocket");
HOOKPROC p=(HOOKPROC)GetProcAddress(h,"GetMsgProc");
HHOOK g_hhook = SetWindowsHookEx(WH_GETMESSAGE,p,h,0);
xiaohaofancy 2010-05-21
  • 打赏
  • 举报
回复
继续补充一下:这个87错误是参数错误
我把最后一个进程id改为0,则函数正确执行。
为什么我挂到我的MFC对话框上,就错误呢?
xiaohaofancy 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fishion 的回复:]
PROC p=GetProcAddress(h,"GetMsgProc");
HHOOK g_hhook = SetWindowsHookEx(WH_GETMESSAGE,p,h,dwThreadId);
[/Quote]

2,3楼两位大侠,改成p后直接编译就报错了。。。
fishion 2010-05-21
  • 打赏
  • 举报
回复
PROC p=GetProcAddress(h,"GetMsgProc");
HHOOK g_hhook = SetWindowsHookEx(WH_GETMESSAGE,p,h,dwThreadId);
yxwsbobo 2010-05-21
  • 打赏
  • 举报
回复
HHOOK g_hhook = SetWindowsHookEx(WH_GETMESSAGE,p,h,dwThreadId);


你的GetMsgProc 函数名字是p
xiaohaofancy 2010-05-21
  • 打赏
  • 举报
回复
注:我要挂接的进程,是我自己写的一个mfc对话框程序。和这个应该没关系吧

15,473

社区成员

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

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