全局Hook失败,报126错误,请指教

Raul_Shao 2008-03-27 03:53:53
// Dll;
#pragma data_seg("TestData")
HHOOK g_hMouse;
HINSTANCE g_hInst=NULL;
#pragma data_seg()

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
return CallNextHookEx(g_hInst, nCode, wParam, lParam);
}

DWORD SetHook()
{
g_hMouse = SetWindowsHookEx(WH_MOUSE, MouseProc, g_hInst, 0);
return GetLastError();
}

BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call, LPVOID lpReserved)
{
g_hInst = hModule;
return TRUE;
}

// xx.def 文件;
LIBRARY "trace"

SECTIONS
TestData READ WRITE SHARED

EXPORTS
SetHook @2

// test;
#pragma comment(lib, "xx.lib")
__declspec(dllimport) DWORD SetHook();
BOOL CdlltestDlg::OnInitDialog()
{
...
DWORD dwErr = SetHook(); // dwErr总是为126,这个是为什么,请指教!
return TRUE;
}
...全文
228 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Raul_Shao 2008-04-08
  • 打赏
  • 举报
回复
liran1229:

感谢!成功!
ringphone 2008-03-31
  • 打赏
  • 举报
回复
#pragma data_seg("TestData")
HHOOK g_hMouse;
HINSTANCE g_hInst=NULL;
#pragma data_seg()
-----------------------
你把#pragma先注释掉看看
lihongbin33 2008-03-28
  • 打赏
  • 举报
回复
楼上正解!
liran1229 2008-03-28
  • 打赏
  • 举报
回复
我也遇到了这个问题。
解决的办法1
不用写DllMain()这个函数,把SetWindowsHookEx函数改为SetWindowsHookEx(WH_MOUSE, MouseProc, GetModuleHandle("你这个DLL名字.dll"),0);
其他的地方都一样。
解决办法2
创建一个MFC的DLL.
在MFC给你写好的DLLMain()中进行g_hInst = hModule;
我是这么解决的不知道你的能否解决.

cnzdgs 2008-03-27
  • 打赏
  • 举报
回复
没错的时候就返回成功,别GetLastError。GetLastError是取上次所发生的错误,不是取上次调用的结果。
ouyh12345 2008-03-27
  • 打赏
  • 举报
回复
照楼主的代码修改了一下

#pragma once

#define TEST_HOOK_API __declspec(dllexport)

#ifdef __cplusplus
extern "C" {
#endif

TEST_HOOK_API DWORD SetHook();

#ifdef __cplusplus
}
#endif


#include <Windows.h>
#include "TestHook.h"

#pragma data_seg("TestData")
HHOOK g_hMouse;
HINSTANCE g_hInst=NULL;
#pragma data_seg()

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
return CallNextHookEx(g_hMouse, nCode, wParam, lParam);
}

DWORD SetHook()
{
g_hMouse = SetWindowsHookEx(WH_MOUSE, MouseProc, g_hInst, 0);
return GetLastError();
}

BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call, LPVOID lpReserved)
{
g_hInst = hModule;
return TRUE;
}


#include <stdio.h>
#include <Windows.h>
#include "../TestHook.h"

#pragma comment(lib, "TestHookDll.lib")

int main(int argc, char *argv[])
{
DWORD ret = SetHook();
printf("ret: %d\n", ret);

return 0;
}


在我这的运行结果是1114:动态链接库(DLL)初始化例程失败。
Raul_Shao 2008-03-27
  • 打赏
  • 举报
回复
ouyh12345 :具体说一下,你说的库的依赖是指什么?

如果把SetHook()函数里面的SetWindowsHookEx()函数去掉,然后直接返回一个值时候是正确的。
ouyh12345 2008-03-27
  • 打赏
  • 举报
回复
126:找不到指定的模块。
看库的依赖有没有解决
Raul_Shao 2008-03-27
  • 打赏
  • 举报
回复
刚刚重新编译了一下,还是没有解决,不是这个问题。
cnzdgs 2008-03-27
  • 打赏
  • 举报
回复
lib与dll不匹配,重新编译并更新这两个文件。

15,473

社区成员

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

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