【问题标题】:Communication between EXE and Global Hook DLLEXE 与全局挂钩 DLL 之间的通信
【发布时间】:2011-03-13 16:47:27
【问题描述】:

我有一个应用程序正在加载一个包含全局 GetMessage 挂钩的回调函数的库。我得到了该过程并将其传递给 SetWindowsHookEx 以设置所有正在运行的线程。

问题是我希望 DLL 函数在某种情况下,比如按键,告诉原始应用程序退出,而不是所有应用程序。我能想到的唯一方法是在应用程序中创建一个窗口并让 DLL 调用 SendMessage(HWND_BROADCAST) 以发送应用程序识别退出的自定义消息。但我想验证这是否是最好的方法?

另一个问题也随之而来。假设我希望 DLL 执行一些一次性初始化,例如打开文件。如果我在 DllMain 中执行此操作,那么它似乎会执行多次,因为它被多次加载。这是解决这个问题吗?谢谢。

【问题讨论】:

    标签: c winapi


    【解决方案1】:

    尝试使用WinAPICreateEvent函数

    【讨论】:

      【解决方案2】:

      如果您的 DLL 在应用程序中运行,有很多方法可以识别我当前在哪个 EXE 中运行。例如可以使用GetModuleFileName(NULL, ...) 来获取当前进程的可执行文件的路径。另一种方式:可以验证当前进程中是否存在某些资源,例如版本资源,具有一些特殊值,例如FileDescription(参见http://msdn.microsoft.com/en-us/library/ms646981.aspxhttp://msdn.microsoft.com/en-us/library/ms647464.aspx)。

      如果您的 DLL 没有每个线程的初始化(如 TlsAlloc 等),最好在 DllMain 内调用 DisableThreadLibraryCalls(参见 http://msdn.microsoft.com/en-us/library/ms682579.aspxhttp://msdn.microsoft.com/en-us/library/ms682596.aspx)第二个参数是DLL_PROCESS_ATTACH.

      【讨论】:

        猜你喜欢
        • 2013-05-29
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多