Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C EXE与全局钩子DLL之间的通信_C_Winapi - Fatal编程技术网

C EXE与全局钩子DLL之间的通信

C EXE与全局钩子DLL之间的通信,c,winapi,C,Winapi,我有一个应用程序正在加载一个库,其中包含一个用于全局GetMessage钩子的回调函数。我获取该过程并将其传递给SetWindowsHookEx,以便为所有正在运行的线程进行设置 问题是,我希望DLL函数在某些情况下(如按键)告诉原始应用程序退出,而不是所有应用程序。我能想到的唯一方法是在应用程序中创建一个窗口,并让DLL调用SendMessage(HWND_BROADCAST)发送应用程序识别的自定义消息以退出。但我想验证一下这是否是最好的方法 另一个问题也出现了。假设我希望DLL执行一些一次

我有一个应用程序正在加载一个库,其中包含一个用于全局GetMessage钩子的回调函数。我获取该过程并将其传递给SetWindowsHookEx,以便为所有正在运行的线程进行设置

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


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

尝试使用WinAPI函数

如果您的DLL在应用程序内部运行,有很多方法可以识别我当前运行的EXE。例如,可以使用
GetModuleFileName(NULL,…)
获取当前进程的可执行文件的路径。另一种方法:可以验证当前进程中是否存在版本资源之类的资源,并使用一些特殊值,例如
FileDescription
(请参阅和)

如果您的DLL没有每线程初始化(如
TlsAlloc
等),最好调用
DisableThreadLibraryCalls
(请参阅和)在
DllMain
的内部,第二个参数是
DLL\u PROCESS\u ATTACH