2016-06-02 3 views
2

Сегодня я пытаюсь обмениваться памятью между процессами (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; 
} 

Выход:

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

+0

Внутри 'ReadSharedMemory', вы измените' dat', чтобы указать на отображенной памяти, но это является локальным для функции, и ничего в массиве 'data' не делать в призвании функция. Вместо этого вы должны скопировать память, возвращаемую 'MapViewOfFile', в расположение' dat'. –

ответ

0

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

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

Причина в том, «Unmapping отображенный вид файла аннулирует диапазон, занимаемый видом в адресном пространстве процесса.»

Ссылка: UnmapViewOfFile function

Смежные вопросы