0

如何跨 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 。

4

1 回答 1

1

在共享内存区域中,您可以使用所有基本数据类型,如整数和浮点数。如果您对 float 有疑问,这与内存的共享性质无关,例如 C/Pascal 之间对 float/double/long_double 的理解不同。您不能使用指针。不包含 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结构放入上面的联合中,因为它包含复杂的字段。

于 2012-08-10T00:47:26.593 回答