Shared Memory bedeutet nicht das Senden und Empfangen von Daten. Es ist ein Speicher für die Anzahl der Prozesse ohne Verletzung erstellt. Dafür müssen Sie einige Mechanismen wie Sperren befolgen, damit die Daten nicht beschädigt werden.
Im Verfahren 1:
CreateFileMapping()
: Es wird den Shared-Memory-Block, mit dem in der letzten Parametern angegebenen Namen erstellen, wenn es nicht bereits vorhanden ist, und gibt einen Handle (Sie kann es einen Zeiger nennen) zurück, Falls erfolgreich.
MapViewOfFile()
: Es bildet (enthält) diesen freigegebenen Block im Prozess Adressraum und gibt ein Handle (wieder kann man einen Zeiger sagen).
Mit diesem von MapViewOfFile()
zurückgegebenen Zeiger können Sie nur auf diesen freigegebenen Block zugreifen.
Im Verfahren 2:
OpenFileMapping()
: Wenn der Shared-Memory-Block erfolgreich durch CreateFileMapping()
erstellt wird, können Sie es mit dem gleichen Namen verwenden können (Name verwendet, um den gemeinsamen Speicherblock).
UnmapViewOfFile()
: Es wird die Zuordnung aufgehoben (Sie können den freigegebenen Speicherblock aus diesem Prozessadressraum entfernen). Wenn Sie mit dem gemeinsamen Speicher fertig sind (d. H. Zugriff, Änderung usw.), rufen Sie diese Funktion auf.
Closehandle()
: schließlich den freigegebenen Speicherblock vom Prozess trennen, rufen Sie dies mit Argument, Handle von OpenFileMapping() oder CreateFileMapping() zurückgegeben.
Obwohl diese Funktionen einfach aussehen, ist das Verhalten schwierig, wenn die Flags nicht richtig ausgewählt sind. Wenn Sie Shared Memory lesen oder schreiben möchten, geben Sie PAGE_EXECUTE_READWRITE
in CreateFileMapping()
an.
Wenn Sie nach dem erfolgreichen Erstellen auf den gemeinsam genutzten Speicher zugreifen möchten, verwenden Sie FILE_MAP_ALL_ACCESS
in MapViewOfFile()
.
Es ist besser zu spezifizieren FALSE
(erben Sie nicht Handle von Elternprozess) in OpenFileMapping()
, da es Verwirrung vermeiden wird.
Murali Devi bietet [funktionierenden Beispielcode für Shared Memory in Windows] (http://comsci.liu.edu/~murali/win32/SharedMemory.htm). Sein Beispiel verwendet Speicher, keine tatsächliche Datei, also ist es genau der Fall, den Sie beschreiben. –