shared memory Probleme (MappedFile)
-
also folgende Funktion (1:1 aus meinem projekt kopiert) funktioniert bei mir einfach nicht... Der Sinn ist eigetnlich, daß ich die mit NULL vorinitialisierte variable "all_mipts_ships" einfach nicht schaffe mit dem Wert aus dem shard memory upzudaten... Aber es gibt auch keinen Absturz des Programmes, was heisst, "all_mipts_ships" belibt immer auf NULL.
(der Sinn ist ein Datenaustausch über eine beliebige Anzahl dll's hinweg, die aber alle vom gleichen programm direkt hintereinander aufgerufen werden (kein multithread Programm). Ich will im shared memory einen pointer speichern, der auf eine Liste mit Objekten zeigt. Diese liste ist vom Typ "SHIPLIST") Vielleicht fällt ja jemandem ein Fehler auf.. der Code ist eine klein-bischen abgewandelte Form aus dem beispiel aus der MSDN doku.
int MIPTS_Module::UpdateSharedMemory(){ //the following code is taken from http://msdn2.microsoft.com/en-us/library/aa366551(VS.85).aspx struct SHIPLISTINFO{ bool exists; SHIPLIST* pshiplist; }; const int BUF_SIZE=256; const TCHAR szName[]=TEXT("MIPTS\\shiplistpointer"); HANDLE hMapFile; LPVOID pBuf; hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, // use paging file NULL, // default security PAGE_READWRITE, // read/write access 0, // max. object size BUF_SIZE, // buffer size szName); // name of mapping object int hMapError=GetLastError(); if (hMapFile == NULL){ cerr<<"Could not create file mapping object "<<hMapError<<"\n"; return 1; } pBuf = MapViewOfFile(hMapFile, // handle to map object FILE_MAP_ALL_ACCESS, // read/write permission 0, 0, BUF_SIZE); if (pBuf == NULL) { cerr<<"Could not map view of file "<<GetLastError()<<endl; return 2; }else if(hMapError!=ERROR_ALREADY_EXISTS) { SHIPLIST *slinfo=new SHIPLIST(); CopyMemory((PVOID)pBuf, (PVOID)(&slinfo), sizeof(slinfo)); } SHIPLIST *slinfo; CopyMemory((PVOID)(&slinfo), (PVOID)pBuf, sizeof(slinfo)); all_mipts_ships=slinfo; UnmapViewOfFile(pBuf); CloseHandle(hMapFile); return 0; }
-
yeus schrieb:
SHIPLIST *slinfo; CopyMemory((PVOID)(&slinfo), (PVOID)pBuf, sizeof(slinfo)); all_mipts_ships=slinfo;Das sollte dir um die Ohren fliegen. Wenn ich intelligent raten müsste, würde ich vermuten, dass es ungefähr so aussehen sollte:
... if (pBuf == NULL) { cerr<<"Could not map view of file "<<GetLastError()<<endl; return 2; } if(hMapError!=ERROR_ALREADY_EXISTS) { all_mipts_ships = all_mipts_ships != NULL ? new(all_mipts_ships) SHIPLIST() : new SHIPLIST(); memcpy( pBuf, all_mipts_ships, sizeof *all_mipts_ships ); } else memcpy( all_mipts_ships, pBuf, sizeof *all_mipts_ships ); UnmapViewOfFile(pBuf); ...ohne ein paar Deklarationen und Erklärungen, was passieren soll, ist das natürlich nur ein Blick durch die Glaskugel.
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.