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.


Anmelden zum Antworten