You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SetWindowsHookEx返回NULL,64位DLL注入报错87(参数错误)求助

解决DLL注入时“挂钩进程失败: 87 参数不正确”的问题

嘿,这个错误码87我太熟了——就是调用SetWindowsHookEx时传入的参数出问题了!虽然你已经确认了目标进程和DLL都是64位,排除了最常见的位数不兼容坑,但还是有几个关键细节要逐一排查:

  • 先检查idHook钩子类型是否合法
    你得确认传入的钩子类型是符合要求的:比如像WH_KEYBOARD_LL、WH_MOUSE_LL这类低级钩子根本不需要注入DLL,但如果是WH_CALLWNDPROC、WH_GETMESSAGE这类全局钩子,就必须确保钩子函数在DLL里,且参数完全匹配钩子类型的要求。另外64位环境下别混用32位的钩子常量定义(虽然头文件一般会自动处理,但还是要确认下)。

  • 盯紧hMod模块句柄的正确性
    这个参数是你要注入的DLL的模块句柄,绝对不能错!如果是全局钩子(dwThreadId设为0),hMod必须指向包含钩子函数的DLL;如果是线程钩子(指定了具体线程ID),但你要注入DLL的话肯定是全局钩子场景对吧?那你获取句柄的方式对吗?比如用GetModuleHandle(dll_name)的话,如果DLL还没加载到当前进程,会直接返回NULL,这时候得用LoadLibraryEx加载DLL并获取句柄,还要注意用绝对路径,避免目标进程找不到你的DLL。

  • 别把进程ID当成线程ID传给dwThreadId
    这是新手常犯的错!如果要注入目标进程的所有线程,dwThreadId要设为0;如果指定单个线程,必须传目标进程里真实存在的活跃线程ID,而不是进程ID。64位环境下线程ID是DWORD类型,别传错数值。

  • 钩子函数的签名必须严丝合缝
    你的DLL里的钩子函数必须严格对应钩子类型的原型,比如WH_CALLWNDPROC的钩子函数得是这个样子:

    LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam);
    

    哪怕参数类型差一点,比如把WPARAM写成int,编译可能过,但调用SetWindowsHookEx时就会触发错误87,因为底层校验不通过。

  • DLL路径一定要靠谱
    传入的dll_name最好用绝对路径,别依赖当前工作目录——目标进程的工作目录可能和你的进程不一样,找不到DLL也会导致参数无效。另外你用的是TCHAR,要确保路径字符串的编码和函数匹配(宽字符/ANSI别混着来)。

最后给个小技巧:调用SetWindowsHookEx前,把每个参数的值都打印出来看看——比如hMod是不是NULL,dwThreadId是不是正确的线程ID,很快就能定位到哪个参数出问题了。

内容的提问来源于stack exchange,提问作者xizt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:38:34