在DLL实例之间使用exe回调 我编写了一个C++ exe,它将我的DLL绑定到Windows钩子,这就需要在每个进程中注入一个DLL实例。因此,您随时都有1个exe和1个或多个DLL实例

在DLL实例之间使用exe回调 我编写了一个C++ exe,它将我的DLL绑定到Windows钩子,这就需要在每个进程中注入一个DLL实例。因此,您随时都有1个exe和1个或多个DLL实例,c++,winapi,C++,Winapi,我知道在DLL中,您可以使用#pragma data_seg(…)和链接器注释在DLL之间共享数据,但需要注意的是,由于明显的原因(动态内存地址、指针偏移等),您可能无法以这种方式共享指针 但是,我可以走相反的方向吗?也就是说,在DLL可以调用的exe中是否有回调函数?其原理是,如果我可以在exe中的内存中将此函数位置定义为“固定”,那么任何DLL实例调用它都应该是安全的 这可能吗?我担心exe对于这种方法来说太低了 如果没有,是否有任何机制可用于在多个DLL实例之间共享单个回调函数 非常感谢不

我知道在DLL中,您可以使用
#pragma data_seg(…)
和链接器注释在DLL之间共享数据,但需要注意的是,由于明显的原因(动态内存地址、指针偏移等),您可能无法以这种方式共享指针

但是,我可以走相反的方向吗?也就是说,在DLL可以调用的exe中是否有回调函数?其原理是,如果我可以在exe中的内存中将此函数位置定义为“固定”,那么任何DLL实例调用它都应该是安全的

这可能吗?我担心exe对于这种方法来说太低了

如果没有,是否有任何机制可用于在多个DLL实例之间共享单个回调函数


非常感谢

不,您不能将函数指针放入共享段。您仍然可以跨进程边界访问进程本地内存地址,这是不好的


您可以改为让EXE将其拥有的
HWND
放入共享段。可以跨流程边界共享
HWND
。这样,DLL的多个实例可以在需要时向该HWND发送消息,EXE可以根据需要处理这些消息。

否,不能将函数指针放入共享段。您仍然可以跨进程边界访问进程本地内存地址,这是不好的


您可以改为让EXE将其拥有的
HWND
放入共享段。可以跨流程边界共享
HWND
。这样,DLL的多个实例可以在需要时向该HWND发送消息,EXE可以根据需要处理这些消息。

否,不能将函数指针放入共享段。您仍然可以跨进程边界访问进程本地内存地址,这是不好的


您可以改为让EXE将其拥有的
HWND
放入共享段。可以跨流程边界共享
HWND
。这样,DLL的多个实例可以在需要时向该HWND发送消息,EXE可以根据需要处理这些消息。

否,不能将函数指针放入共享段。您仍然可以跨进程边界访问进程本地内存地址,这是不好的


您可以改为让EXE将其拥有的
HWND
放入共享段。可以跨流程边界共享
HWND
。这样,DLL的多个实例可以在需要时向该HWND发送消息,EXE可以根据自己的需要处理这些消息。

很难猜测回调函数与DLL中的共享内存有何关系。听起来像是在另一个进程中调用函数。这是一个不。本质上是的,这是一个想法。我不想使用服务/RESTAPI等,因此可能需要重新开始。您试图避免注入的DLL过于繁重的业务逻辑。您使用非常笨拙的方式在进程之间进行通信,这让您的生活很痛苦。共享内存只是内存,它对所需的同步毫无帮助。命名管道更容易使用。我对其他方法持开放态度,但如果你有一种方法,你应该将其作为答案发布,这样它可能会获得好评。我只是在猜测。很难猜测回调函数如何与DLL中的共享内存相关。听起来像是在另一个进程中调用函数。这是一个不。本质上是的,这是一个想法。我不想使用服务/RESTAPI等,因此可能需要重新开始。您试图避免注入的DLL过于繁重的业务逻辑。您使用非常笨拙的方式在进程之间进行通信,这让您的生活很痛苦。共享内存只是内存,它对所需的同步毫无帮助。命名管道更容易使用。我对其他方法持开放态度,但如果你有一种方法,你应该将其作为答案发布,这样它可能会获得好评。我只是在猜测。很难猜测回调函数如何与DLL中的共享内存相关。听起来像是在另一个进程中调用函数。这是一个不。本质上是的,这是一个想法。我不想使用服务/RESTAPI等,因此可能需要重新开始。您试图避免注入的DLL过于繁重的业务逻辑。您使用非常笨拙的方式在进程之间进行通信,这让您的生活很痛苦。共享内存只是内存,它对所需的同步毫无帮助。命名管道更容易使用。我对其他方法持开放态度,但如果你有一种方法,你应该将其作为答案发布,这样它可能会获得好评。我只是在猜测。很难猜测回调函数如何与DLL中的共享内存相关。听起来像是在另一个进程中调用函数。这是一个不。本质上是的,这是一个想法。我不想使用服务/RESTAPI等,因此可能需要重新开始。您试图避免注入的DLL过于繁重的业务逻辑。您使用非常笨拙的方式在进程之间进行通信,这让您的生活很痛苦。共享内存只是内存,它对所需的同步毫无帮助。命名管道更容易使用。我对其他方法持开放态度,但如果你有一种方法,你应该将其作为答案发布,这样它可能会获得好评。我只是在猜测。