您的位置:首页 > 其它

在使用一个全局底层键盘钩子dll时遇到的问题

2011-02-26 13:17 429 查看
钩子的dll代码是网上找的,Google TrayKeys即可。

因为不想用静态链接dll的方式,于是用LoadLibrary GetProcAddress等函数。

与公司另一个Hook的dll的载入方式作比较,写下了一些载入的代码。

结果GetProcAddress返回的地址为空,导致的原因是GetProcAddress的传入参数必须是name mangling之后的标识符才能正常导入函数,关于详细点的信息可以看下面的这个链接。

http://blog.csdn.net/enjolras/archive/2010/11/21/6024658.aspx

后面通过Depends工具查看解决:

函数调用约定由编译dll工程的设置来决定,若函数指针与之不对应会引发call stack错误详情也可以参考上面的文章。

typedef BOOL (_cdecl *StartHookPFun)(BOOL bEnable);

m_Pfun = (StartHookPFun)GetProcAddress(m_hDll,"?DisableTaskKeys@@YAHH@Z");

解决方法二:

使用extern "C"定义导出函数:

#ifdef _cplusplus

extern "C"

{

#endif

DLLEXPORT BOOL DisableTaskKeys(BOOL bDisable)

{

if (bDisable) {

if (!g_hHookKbdLL) {

g_hHookKbdLL = SetWindowsHookEx(WH_KEYBOARD_LL,

MyTaskKeyHookLL, MyDll.m_hInstance, 0);

}

} else if (g_hHookKbdLL != NULL) {

UnhookWindowsHookEx(g_hHookKbdLL);

g_hHookKbdLL = NULL;

}

return AreTaskKeysDisabled();

}

ifdef _cplusplus

}

#endif

这里要注意函数调用约定问题,若dll的调用约定是__stdall:

typedef BOOL (__stdcall *StartHookPFun)(BOOL bEnable);

//注意函数名

m_Pfun = (StartHookPFun)GetProcAddress(m_hDll,"_DisableTaskKeys@4");

若dll的调用约定是__cdecl:

typedef BOOL (__cdecll *StartHookPFun)(BOOL bEnable);

//注意函数名

m_Pfun = (StartHookPFun)GetProcAddress(m_hDll,"DisableTaskKeys");

此外还有链接dll的方式,可以参考TrayKeys的代码,此项目中导入lib是在编译选项中设定的,更推荐用#pragma comment(lib,"xxxxxx.lib")的方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: