如何跨DLL共享对象?
示例:
DLLA由进程A加载.DLL A收集数据(拦截来自进程A的调用)。
DLLB由Pascal程序加载,并希望使用DLLA收集的数据。
我用DLLA创建了一个映射:
GL_EXTERN bool __stdcall CreateSharedMemory()
{
if ((hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, MapSize, SharedMemoryName.c_str())) == NULL)
{
return false;
}
if ((pData = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, MapSize)) == NULL)
{
CloseHandle(hMapFile);
return false;
}
return true;
}
DLLB只是打开它并映射它。
他们可以共享命令。因此,DLL B可以提供DLLA命令并检索数据,但我似乎无法弄清楚如何在内存中共享对象/类/向量。
我尝试过使用指针,但意识到这是无效的并且会出现访问冲突错误。它似乎也很好地共享整数,但它似乎无法共享浮点数:S我怎样才能完成这些任务?
编辑:我要沟通:
int* Foo = static_cast<int*>(pData); where pData is the map pointer.
//Then I do:
Foo[0] = X; Foo[1] = Y;
让进程从相应的值读取和写入。
的信息:
这是DLLA的文件:http://pastebin.com/MFkqwxJe和http://pastebin.com/MDeWprkb
这是DLLB的文件:http://pastebin.com/Uj3dijc4和http://pastebin.com/vkDdPp7e
编辑:根据要求将其缩小为:http://pastebin.com/hNF6Cu2L。
答案 0 :(得分:1)
在共享内存区域中,您可以使用所有基本数据类型,如整数和浮点数。如果你有浮点问题,这与内存的共享性质无关,比如浮点数/双精度/ long_double的C / Pascal之间的不同理解。你不能使用指针。没有安装VMT但没有指针的结构也可以。可以使用共享区域开头的偏移(直接或间接)来模拟复杂数据结构。
要进行同步(如事件),您可以使用命名对象。
您还可以在进程之间传递句柄。检查DuplicateHandle
功能。
继续:
Data[3] = &ListOfModels[0];
在这里,您将不属于共享内存区域的地址放入共享内存。共享内存区域中的数据应完全自包含,这意味着所有数据都应位于该区域中。结构的定义应如下所示:
struct SaredData
{
int data_type;
int status;
union
{
struct
{
int num_font_char_objects;
FontChar font_char_objects[MAX_FONT_CHARS_SUPPORTED];
};
...........
};
};
您需要确保共享内存区域的大小足以存储所有传递的对象。来自STL的任何容器都不太可能使用共享内存。
您不能将Model
结构放入上面的联合中,因为它包含复杂的字段。