我有一个庞大的程序(A),使用大约30个(我自己的大部分,第三方)dll。它使用ActiveX,ATL和MFC来做不同的事情。现在我想将wxWidgets用于某些特殊任务,并将从程序中调用wxWidgets对话框。我可以使用一个特殊设计的DLL来实现这一点,它采用了wxW ..部件。但是要运行带或不带A程序的特殊任务,我想把wxW ..东西放在exe(B)中,这些exe应该从A程序中寻址相同的数据。据我所知每个* .exe都有自己的进程,所以我不能共享相同的指针地址。
我可以在其中一个DLL中放入一些共享数据块。
#pragma data_seg("SHARED")
CClassA *g_ClassAPointer=NULL;
#pragma data_seg()
#pragma comment(linker, "/section:SHARED,RWS")
如果A正在运行并且启动B,我可以获得指针g_ClassAPointer,其地址在A中。有没有办法获取地址或获得偏移量来到达B中的这个地址?
提前致谢,
豪伊
BTW:我们也希望使用wxWidgets来淡化所有MFC的东西,越过平台代码,否则我会坚持使用MFC或在包装器* .exe中使用wxW-DLL。答案 0 :(得分:2)
您正在寻找共享内存,而通常的创建方法是通过CreateFileMapping
。这可以创建由命名文件支持的共享内存,或者由页面文件支持。 (由GlobalAlloc
分配的内存也由页面文件支持,因此这并不罕见。)
在任何一种情况下,来自CreateFileMapping
的内存块都被命名,因此另一个进程可以通过调用具有相同名称的OpenFileMapping
来访问共享内存块。
请记住,共享内存块可能驻留在内存中的不同偏移量中。此外,如果将CClassA
放在共享内存中,则没有自动机制来确保CClassA
内的所有指针都指向同一共享内存块。例如。在共享内存中放置std::string
或MFC CString
不太可能实现您的目标。