2016-10-10 6 views
-2

Ich möchte einen gemeinsamen Speicher zwischen zwei Prozessen erstellen. Deshalb habe ich einfach die snipped von der Microsoft-Seite kopiert:Kann Shared Memory nicht zuordnen

Snippet 1:

#define BUF_SIZE 256 
TCHAR szName[] = TEXT("Global\\MyFileMappingObject"); 
TCHAR szMsg[] = TEXT("Message from first process."); 

void initSharedMem() { 
HANDLE hMapFile; 
LPCTSTR pBuf; 

hMapFile = CreateFileMapping(
    INVALID_HANDLE_VALUE, // use paging file 
    NULL,     // default security 
    PAGE_READWRITE,   // read/write access 
    0,      // maximum object size (high-order DWORD) 
    BUF_SIZE,    // maximum object size (low-order DWORD) 
    szName);     // name of mapping object 

if (hMapFile == NULL) { 
    MessageBox(0, "Could not create file mapping object", "Error", 0); 
    return; 
} 
pBuf = (LPTSTR)MapViewOfFile(hMapFile, // handle to map object 
    FILE_MAP_ALL_ACCESS, // read/write permission 
    0, 
    0, 
    BUF_SIZE); 

if (pBuf == NULL) { 
    MessageBox(0, "Could not map view of file", "Error", 0); 
    CloseHandle(hMapFile); 

    return; 
} 


CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR))); 
_getch(); 

UnmapViewOfFile(pBuf); 

CloseHandle(hMapFile); 

MessageBox(0, "Done init shared mem", "Done", 0); 
return; 
} 

Snippet 2 (anderes Verfahren):

#define BUF_SIZE 256 
TCHAR szName[] = TEXT("Global\\MyFileMappingObject"); 
TCHAR szMsg[] = TEXT("Message from first process."); 

void readSharedMem() { 
HANDLE hMapFile; 
LPCTSTR pBuf; 

hMapFile = OpenFileMapping(
    FILE_MAP_ALL_ACCESS, // read/write access 
    FALSE,     // do not inherit the name 
    szName);    // name of mapping object 

if (hMapFile == NULL) { 
    MessageBox(0, L"Error", L"Could not open file mapping object", 0); 
    return; 
} 

pBuf = (LPTSTR)MapViewOfFile(hMapFile, // handle to map object 
    FILE_MAP_ALL_ACCESS, // read/write permission 
    0, 
    0, 
    BUF_SIZE); 

if (pBuf == NULL) { 
    MessageBox(0, L"Error", L"Could not map file", 0); 

    CloseHandle(hMapFile); 

    return; 
} 

MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK); 

UnmapViewOfFile(pBuf); 

CloseHandle(hMapFile); 

return; 

MessageBox(0, L"Done", L"SharedMemoryDone", 0); 
} 

Ich nenne die erste Funktion in Verfahren A, und erhalten die fertige Nachricht. Aber wenn ich die readSharedMem-Funktion danach aufruft, erhalte ich die Fehlermeldung "Datei-Mapping-Objekt konnte nicht geöffnet werden".

Was mache ich hier falsch?

+0

Ist Ihr Prozess A noch aktiv, wenn Sie versuchen, den Shared Memory-Abschnitt zu öffnen? Außerdem, welchen Fehlercode erhalten Sie, wenn 'OpenFileMapping' fehlschlägt? – IInspectable

+1

Hinweis: Kopieren Sie niemals Code. Im Idealfall sollten Sie den Code erneut eingeben und die Bedeutung von etwas nachschlagen, das Sie nicht verstehen. So lernst du neue Konzepte. – CodeMouse92

+0

Ja beide sind am Leben, und Fehlercode ist 2. – QDA

Antwort

1

Ich rufe die erste Funktion in Prozess A, und erhalten Sie die Fertigmeldung.

Zu dem Zeitpunkt, zu dem die Fertigmeldung angezeigt wird, wurde das Dateizuordnungsobjekt bereits geschlossen und ist daher nicht mehr vorhanden.

Aber wenn ich die readSharedMem-Funktion danach aufrufen, bekomme ich die Fehlermeldung "Konnte Dateizuordnungsobjekt nicht öffnen".

Sie haben es zu spät verlassen! Sie mussten das Dateizuordnungsobjekt öffnen, während es noch vorhanden war. Das ist vermutlich der Aufruf an _getch in dem ersten Snippet ist; Sie sollten das andere Programm an diesem Punkt ausführen, bevor Sie eine Taste drücken, um fortzufahren.

+0

Ja, das war es, ich dachte dasselbe, bevor ich schlafen ging. Ich habe es jetzt versucht und die MessageBox mit "Process2" erscheint, aber es gibt jetzt ein anderes Problem. In der Nachrichtenbox sind einige chinesische Buchstaben anstelle von "Nachricht vom ersten Prozess". Warum werden sie falsch interpretiert? – QDA

+0

Wahrscheinlich haben Sie sich mit den Unicode-Einstellungen herumgeschlagen, da einige der früheren Kommentare darauf hinwiesen, dass sie Ihr Problem sein könnten. (Für den Eintrag sollten Sie * immer * den Unicode-Modus verwenden.) –