跨模块的共享内存对象

时间:2012-08-10 00:24:51

标签: c++

如何跨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/MFkqwxJehttp://pastebin.com/MDeWprkb

这是DLLB的文件:http://pastebin.com/Uj3dijc4http://pastebin.com/vkDdPp7e

编辑:根据要求将其缩小为:http://pastebin.com/hNF6Cu2L

1 个答案:

答案 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结构放入上面的联合中,因为它包含复杂的字段。