1

我有一个巨大的程序(A),它使用了大约 30 个(我自己的大部分,一些第 3 方)dll。它使用 ActiveX、ATL 和 MFC 来做不同的事情。现在我想将 wxWidgets 用于一些特殊任务,并将从程序中调用 wxWidgets 对话框。我可以使用一个特殊设计的 DLL 来做到这一点,该 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,我可以获得带有 A 内地址的指针 g_ClassAPointer。有没有办法获取地址或获取偏移量以到达 B 内的该地址?

提前致谢,

豪伊

顺便说一句:我们还想使用 wxWidgets 越来越多地淡化所有 MFC 内容以跨平台代码,否则我会坚持使用 MFC 或在包装器 *.exe 中使用 wxW - DLL。

4

1 回答 1

2

您正在寻找共享内存,通常的创建方法是通过CreateFileMapping. 这可以创建由命名文件支持或由分页文件支持的共享内存。(分配的内存GlobalAlloc 也由页面文件支持,所以这并不稀奇)。

在任何一种情况下,内存块都被命名,因此另一个进程可以通过使用相同的名称CreateFileMapping调用来访问共享内存块。OpenFileMapping

请记住,共享内存块可能驻留在内存中的不同偏移量处。此外,如果您放入CClassA共享内存,则没有自动机制来确保内部的所有指针都指向CClassA同一个共享内存块。例如,将一个std::string或 MFCCString放在共享内存中不太可能达到您的预期。

于 2013-04-16T07:25:07.237 回答