我有一个应用程序加载一个包含全局GetMessage挂钩的回调函数的库。我得到了程序并将其传递给SetWindowsHookEx,以便为所有正在运行的线程设置。
问题在于我希望DLL函数在某种情况下像按键一样,告诉原始应用程序退出,而不是所有应用程序。我能想到的唯一方法是在应用程序中创建一个窗口,并让DLL调用SendMessage(HWND_BROADCAST)来发送应用程序识别退出的自定义消息。但我想验证这是否是最好的方法呢?
另一个问题也出现了。假设我希望DLL执行一些一次性初始化,例如打开文件。如果我在DllMain中这样做,那么它似乎多次这样做,因为它被多次加载。这是解决这个问题吗?感谢。
答案 0 :(得分:1)
尝试使用WinAPI CreateEvent函数
答案 1 :(得分:1)
如果您的DLL在应用程序内部运行,则有很多方法可以识别我当前正在运行的EXE。例如,可以使用GetModuleFileName(NULL, ...)
来获取当前进程的可执行文件的路径。另一种方式:可以验证某些资源(如版本资源)是否存在于当前流程中,并具有一些特殊值,例如FileDescription
(请参阅http://msdn.microsoft.com/en-us/library/ms646981.aspx和http://msdn.microsoft.com/en-us/library/ms647464.aspx)。
如果您的DLL没有每个线程初始化(例如TlsAlloc
等),最好在其中调用DisableThreadLibraryCalls
(请参阅http://msdn.microsoft.com/en-us/library/ms682579.aspx和http://msdn.microsoft.com/en-us/library/ms682596.aspx) DllMain
是第二个参数DLL_PROCESS_ATTACH
。