Как использовать именованную общую память?

Сегодня я пытаюсь разделить память между процессами (2 DLL). Пока я хотел бы поделиться текстом только для отладки. Кажется, мне удалось создать именованную общую память и прочитать ее, но при чтении память кажется пустой. Что я могу делать неправильно?

VOID sharedMemory() {
    if (CreateSharedMemory(TEXT("Global\testMem"), TEXT("hello shared memory"))) {
        out = out + " | created shared memory";
    } else {
        out = out + " | failed to create shared memory";
    }


    wchar_t data[100];
    if (ReadSharedMemory(TEXT("Global\testMem"), data)) {
        std::wstring ws(data);
        out = out + " | shared memory: " + std::string(ws.begin(), ws.end());
    } else {
        out = out + " | no shared memory";
    }
}

BOOL ReadSharedMemory(TCHAR* memName, TCHAR* dat) {
    HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, memName);
    if (hMapFile == NULL) {
        return FALSE;
    }

    dat = (LPTSTR)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 1024);
    if (dat == NULL) {
        CloseHandle(hMapFile);
        return FALSE;
    }

    UnmapViewOfFile(dat);
    CloseHandle(hMapFile);
    return TRUE;
}

BOOL CreateSharedMemory(TCHAR* memName, TCHAR* data) {
    HANDLE hMapFile = hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 1024, memName);
    if (hMapFile == NULL) {
        return FALSE;
    }

    LPCTSTR pBuf = (LPTSTR)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 1024);
    if (pBuf == NULL) {
        CloseHandle(hMapFile);
        return FALSE;
    }

    CopyMemory((PVOID)pBuf, data, (_tcslen(data) * sizeof(const wchar_t)));
    UnmapViewOfFile(pBuf);
    return TRUE;
}

Результат:

создал общую память | Общая память:


person MircoProgram    schedule 02.06.2016    source источник
comment
Внутри ReadSharedMemory вы изменяете dat так, чтобы он указывал на отображенную память, но это локально для функции и ничего не делает с массивом data в вызывающей функции. Вместо этого вы должны скопировать память, возвращенную MapViewOfFile, в расположение dat.   -  person Karsten Koop    schedule 02.06.2016


Ответы (1)


Вместо BOOL ReadSharedMemory(TCHAR* memName, TCHAR* dat)
используйте BOOL ReadSharedMemory(TCHAR* memName, std::wstring *szData) и передайте указатель на экземпляр std::wstring вместо TCHAR*.

Кроме того, обновите szData внутри ReadSharedMemory следующим образом szData->append(dat); перед вызовом UnmapViewOfFile(dat);

Причина в том, что «Отмена сопоставления представления файла делает недействительным диапазон, занимаемый представлением в адресном пространстве процесса».

Ссылка: функция UnmapViewOfFile

person sameerkn    schedule 02.06.2016