我正尝试使用WINAPI通过命名共享内存共享结构体数组。我能够创建和管理共享内存,但是当尝试共享结构体数组时,读取的数组大小总是为0。
以下是我编写的测试代码,应该可以写入/读取10个条目的数组,但即使这也失败了。然而,我的目标是编写/读取一个包含2个动态数组及其当前信息的动态结构体数组。
我知道不应该在进程之间共享指针,因为它们可能指向随机值。因此,我正在使用new为数组分配内存。
这是我现在拥有的: 两个进程都共享的内容:
写入10个条目似乎是有效的,但是尝试读取内存时,它会成功返回并且数组大小为0,如下所示:
以下是我编写的测试代码,应该可以写入/读取10个条目的数组,但即使这也失败了。然而,我的目标是编写/读取一个包含2个动态数组及其当前信息的动态结构体数组。
我知道不应该在进程之间共享指针,因为它们可能指向随机值。因此,我正在使用new为数组分配内存。
这是我现在拥有的: 两个进程都共享的内容:
#define MEMSIZE 90024
typedef struct {
int id;
int type;
int count;
} Entry;
步骤 1:
extern HANDLE hMapObject;
extern void* vMapData;
std::vector<Entry> entries;//collection of entries
BOOL DumpEntries(TCHAR* memName) {//Returns true, writing 10 entries
int size = min(10, entries.size());
Entry* eArray = new Entry[size];
for (int i = 0; i < size; i++) {
eArray[i] = entries.at(i);
}
::hMapObject = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, MEMSIZE, memName);
if (::hMapObject == NULL) {
return FALSE;
}
::vMapData = MapViewOfFile(::hMapObject, FILE_MAP_ALL_ACCESS, 0, 0, MEMSIZE);
if (::vMapData == NULL) {
CloseHandle(::hMapObject);
return FALSE;
}
CopyMemory(::vMapData, eArray, (size * sizeof(Entry)));
UnmapViewOfFile(::vMapData);
//delete[] eArray;
return TRUE;
}
第二步骤:
BOOL ReadEntries(TCHAR* memName, Entry* entries) {//Returns true reading 0 entries
HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, memName);
if (hMapFile == NULL) {
return FALSE;
}
Entry* tmpEntries = (Entry*)(MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 10 * sizeof(Entry)));
if (tmpEntries == NULL) {
CloseHandle(hMapFile);
return FALSE;
}
entries = new Entry[10];
for (int i = 0; i < 10; i++) {
entries[i] = tmpEntries[i];
}
UnmapViewOfFile(tmpEntries);
CloseHandle(hMapFile);
return TRUE;
}
写入10个条目似乎是有效的,但是尝试读取内存时,它会成功返回并且数组大小为0,如下所示:
Entry* entries = NULL;
if (ReadEntries(TEXT("Global\Entries"), entries)) {
int size = _ARRAYSIZE(entries);
out = "Succesfully read: " + to_string(size);// Is always 0
}
所以我的问题是,我做错了什么?我在两个进程之间共享相同的结构体, 为要写入的条目分配新的内存并使用大小为10 * sizeof(Entry);
的内存进行复制。尝试读取时,我也尝试读取10 * sizeof(Entry);
字节,并将数据转换为Entry*
。我是否漏掉了什么?欢迎任何帮助。