在使用一个全局底层键盘钩子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")的方式。
因为不想用静态链接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")的方式。
相关文章推荐
- java工程项目里,在一个包里面,不能出现同名的类名,这问题是刚接触java才会遇到的,特别是新手一般都没有建立包,而是使用默认的,易出现同名的类名,导致eclipse提示错误
- QT中安装不使用dll的全局钩子
- myeclipse中使用debug时遇到的一个小问题
- .net 使用mysql 遇到的一个问题
- 遇到的问题-----------定义一个全局变量,在page_load里赋值,但在其他按钮中调用仍为空
- php 取地址&符号使用遇到的一个问题
- ISE使用过程中遇到的一个诡异问题
- 在使用mybaitis传参数的时候,仅传入一个类型为String的参数所遇到的问题
- RecyclerView初使用遇到的一个问题
- 使用Eclipse编译Web项目遇到的一个奇葩问题
- 键盘"全局钩子"的使用 ..
- .NET使用钩子捕获全局鼠标和键盘事件
- 在使用BizTalk时遇到一个很郁闷的问题
- angularjs中使用ueditor遇到的一个问题
- php关于使用iconv(...)函数对字符进行中文转换时,遇到的一个问题
- 刚开始使用struts2,遇到一个问题
- 使用SAX2的DefaultHandler遇到的一个问题
- IE7中使用AJAX遇到的一个问题
- 全局钩子使用碰到的问题
- 在使用mesos framework中遇到的一个问题