2009-04-21 15 views
-1

In meinem Projekt habe ich das CreateFileMapping Konzept implementiert, um Speicher zwischen zwei Prozessen zu teilen. Ich habe einen Serverprozess, in dem ich die Speicheradresse meiner Sitzungsdaten speicher, die Details über ein bestimmtes Bild enthält. Und ich habe einen Client-Prozess, in dem ich diese Adresse aus dem Puffer gelesen habe. Jetzt ist das Problem, dass die Adresse im Clientprozess angezeigt wird, aber einige Details fehlen.Fehler beim Verwenden von Windows CreateFilemapping

Dies ist mein Server-Prozess Code:

HANDLE hMem; 
LPCSTR pBuf; 
#define BUF_SIZE 1024 
static const char MemoryName[]="Share Memory Name"; 

hMem=CreateFileMapping(INVALID_HANDLE_VALUE,NULL, PAGE_READWRITE,0, BUF_SIZE, MemoryName); 
pBuf = (LPCSTR) MapViewOfFile(hMem, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE); 
CopyMemory((PVOID)pBuf, session, BUF_SIZE); 
LtEntity test = LtEntity(pBuf); 

Das ist mein Client-Prozess Code:

HANDLE hMem; 
LPCSTR pBuf; 
#define BUF_SIZE 1024 
static const char MemoryName[]="Share Memory Name"; 

hMem = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, MemoryName); 
pBuf = (LPCSTR) MapViewOfFile(hMem, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);     
LtEntity test = LtEntity(pBuf); 

In Server-Prozess die Variable "test" enthält alle Details, aber im Client „test "Einige Daten fehlen.

Die folgende Server-Testvariable zeigt das angehängte Bild, das den Inhalt der Variablen anzeigt.

Die Client-Testvariable unten zeigt das angehängte Bild, das den Inhalt der Variablen zeigt.

Bitte den Unterschied prüfe ich die Positionsdaten auch sichtbar in meinem Client-Prozess benötigen ..

Antwort

0

Sie haben wahrscheinlich Zeiger/Referenzen in LtEntity, die nicht serialisiert werden, auch.

Vielleicht können Sie mehr Informationen über LtEntity geben und welche Daten fehlen.

1

einige Details fehlen

Sie das noch einmal sagen kann. Was ist die Definition von LtEntity?

Enthält die Dateizuordnung eingebettete Zeiger? Diese funktionieren nicht, da der gemeinsame Speicher in jedem Prozess nicht unbedingt die gleiche virtuelle Adresse hat. Und sie funktionieren nicht, wenn sie außerhalb der Dateizuordnung zeigen, selbst wenn der gemeinsame Speicher in jedem Prozess die gleiche virtuelle Adresse aufweist. Anstelle von Zeigern sollten Sie Offsets ab dem Anfang der Dateizuordnung speichern.

Laufen beide Prozesse in derselben Anmeldesitzung? Wenn nicht, müssen Sie den Namen der Dateizuordnung mit dem Namen Global\ prefix ergänzen.

Auch sollten Sie INVALID_HANDLE_VALUE, nicht (HANDLE)0xFFFFFFFFF verwenden. Die Definition von INVALID_HANDLE_VALUE wurde geändert, als 64-Bit-Windows hinzugefügt wurde.

Sie können LtEntity test(pBuf); statt LtEntity test = LtEntity(pBuf); verwenden.

1

Wenn Sie in LtEntity Zeiger haben, wird es nicht funktionieren, da der abgebildete Speicherblock in jedem Prozess typischerweise an einer anderen Adresse beginnt. Verwenden Sie Boost :: interprocess offset pointers, die stattdessen relative Adressen speichern.

+0

+1 für die Empfehlung Boost :: interprocess. Machen Sie sich nicht mit den fehleranfälligen Details der unteren Ebene herumärgern, wenn Sie eine nette (gut getestete) Abstraktion verwenden können. – lothar

Verwandte Themen