EXE和Global Hook DLL之间的通信

时间:2010-07-09 04:43:14

标签: c winapi

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

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

另一个问题也出现了。假设我希望DLL执行一些一次性初始化,例如打开文件。如果我在DllMain中这样做,那么它似乎多次这样做,因为它被多次加载。这是解决这个问题吗?感谢。

2 个答案:

答案 0 :(得分:1)

尝试使用WinAPI CreateEvent函数

答案 1 :(得分:1)

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

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