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

钩子的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")的方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值