2016-04-07 5 views
-3

dieses Programm ausführen soll, um in Shared Memory mit win32 API zu schreiben. Es ist ein Programm wie im Lehrbuch, aber wenn ich versuche, es auszuführen, scheitert es. stürzt, wie ich aufDas Programm stürzt ab, sobald ich

ist

das Programm soll eine Zeichenfolge Shared Memory ausführen klicken

muss
#include<windows.h> 
#include<stdio.h> 

int main(int argc, char *argv[]) 
{ 
    HANDLE hFile, hMapFile; 
    LPVOID lpMapAddress; 
    //mapping of memory 
    hFile=CreateFile("temp.txt",GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);  
    hMapFile = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0,0, TEXT("SharedObject")); 
    lpMapAddress = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0); 
    //writing into shared memory 
    sprintf((char*)lpMapAddress,"shared memory writing"); 


    UnmapViewOfFile(lpMapAddress); 
    CloseHandle(hFile); 
    CloseHandle(hMapFile); 
} 
+3

Code-Stepping mit einem Debugger? hängt.exe? Fehlermeldung? – Ceros

+1

Müssen Sie nicht eine Datei mit mehr als 0 Byte für Speicherkarten zuordnen? Das letzte Mal, als ich mit WINAPI Speicherabbilddateien betrachtete, war Ende der 1990er Jahre. – drescherjm

+0

keine Fehlermeldung wird angezeigt. Es stürzt sofort @ceros –

Antwort

3

der Grund, es stürzt ab, weil die Datei seit mit GENERIC_READ und GENERIC_WRITE Zugriffsrechte geschaffen werden, schreiben die CreateFileMapping() Funktion Ihr Code spezifiziert PAGE_READWRITE als drittes Argument (flProtect). Dies ist aus MSDN-Dokumentation von CreateFileMapping:

Die Datei muss mit Zugriffsrechten geöffnet werden, die mit den Schutz Fahnen kompatibel sind, die die flProtect Parameter

PAGE_READWRITE gibt => Gibt Lese-/Schreibzugriff auf eine bestimmte Region der Seiten. Die von hFile angegebene Datei muss mit den Zugriffsrechten GENERIC_READ und GENERIC_WRITE erstellt werden.

so

ändern

hFile=CreateFile("temp.txt",GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);

zu

hFile=CreateFile("temp.txt",GENERIC_WRITE | GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL); 

Eine weitere Sache, die Sie mit einer Größe von Null eine Datei nicht zuordnen können. Hier ist von MSDN Dokumentation von CreateFileMapping() Funktion:

Wenn diese Parameter (dwMaximumSizeLow) und dwMaximumSizeHigh sind 0 (Null) ist, die maximale Größe des Dateizuordnungsobjekts ist gleich die aktuelle Größe der Datei dass hFile identifiziert.

Ein Versuch, eine Datei mit einer Länge von 0 (Null) zuzuordnen, schlägt mit einem Fehlercode von ERROR_FILE_INVALID fehl. Anwendungen sollten auf Dateien mit einer Länge von 0 (Null) testen und diese Dateien ablehnen.

Wenn eine Anwendung eine Größe für die Dateizuordnungsobjekt angibt, die größer ist als die Größe der tatsächlichen benannte Datei auf der Festplatte ist, wird die Datei auf Platte die angegebene Größe der Dateizuordnungs Objekt übereinstimmen erhöht.

so in Ihrem Fall, da die Datei, die Sie zunächst eine Größe von 0 abzubilden versuchen hat, wird die CreateFileMapping() Funktion fehlschlagen, wenn Sie die Größe eines Dateizuordnungsobjekt in den dwMaximumSizeLow/dwMaximumSizeHigh Parameter von CreateFileMapping() angeben. Sie könnten so etwas tun ...

HANDLE hFile, hMapFile; 
    LPVOID lpMapAddress; 
//mapping of memory 
    hFile=CreateFile(L"temp.txt",GENERIC_WRITE | GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);  
    if(hFile!=INVALID_HANDLE_VALUE) 
    { 
     char* str="shared data to be written";//the data you want to write to the file 
     int strLen=::strlen(str);//get the string length of the data you want to write 
     hMapFile = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0,strLen, TEXT("SharedObject")); //here you also specify the size of the mapping object to be equal to the size of data you want to write 
     if (hMapFile != NULL && hMapFile != INVALID_HANDLE_VALUE) 
     { 
      lpMapAddress = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0); 
      //writing into shared memory 

      if(lpMapAddress!=NULL) 
       sprintf((char*)lpMapAddress,"%s","shared file write"); 
      else 
       printf("error");//error message MapViewOfFile() failed 

      UnmapViewOfFile(lpMapAddress); 
      CloseHandle(hMapFile); 
     } 
     else 
      printf("error");//error message CreateFileMapping() failed 

     CloseHandle(hFile); 
    } 
    else 
     printf("error");//error message CreateFile() failed 
+0

Ich habe diese Aussage schon ausprobiert, aber das Ergebnis ist immer noch das Gleiche !! –

+0

Ich denke, es gibt ein Problem mit der Sprintf-Anweisung, wenn ich es ohne diese Aussage das Programm –

+0

funktionierte, so brauche ich eine Alternative zum Schreiben in den gemeinsamen Speicher –