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

    技术2022-05-20  56

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


    最新回复(0)