2016-06-02 17 views
2

Heute versuche ich, Speicher zwischen Prozessen (2 DLLs) zu teilen. Für den Moment möchte ich nur Text teilen, um etwas zu debuggen. Es scheint mir gelungen zu sein, den genannten gemeinsamen Speicher zu erstellen und ihn zu lesen, aber beim Lesen scheint die Erinnerung leer zu sein. Was könnte ich falsch machen?Wie benannter gemeinsamer Speicher verwendet wird?

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; 
} 

Die Ausgabe lautet:

Shared Memory erstellt | Shared Memory:

+0

Innen 'ReadSharedMemory', ändern Sie' dat' auf den zugeordneten Speicher zu zeigen, aber das ist lokal für die Funktion, und tut nichts, um das Array 'data' in der Berufung Funktion. Stattdessen sollten Sie den von "MapViewOfFile" zurückgegebenen Speicher an den Speicherort von "dat" kopieren. –

Antwort

0

Statt BOOL ReadSharedMemory(TCHAR* memName, TCHAR* dat)
Verwendung BOOL ReadSharedMemory(TCHAR* memName, std::wstring *szData) und Zeiger zu der Instanz std::wstring anstelle von TCHAR* passieren.

Auch aktualisieren szData innerhalb ReadSharedMemory wie szData->append(dat); folgt vor UnmapViewOfFile(dat); Aufruf

Grund ist, „Aufheben der Zuordnung ein zugeordnetes Ansicht einer Datei entkräftet den Bereich durch die Ansicht in den Adressraum des Prozesses besetzt.“

Referenz: UnmapViewOfFile function

Verwandte Themen