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