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
Code-Stepping mit einem Debugger? hängt.exe? Fehlermeldung? – Ceros
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
keine Fehlermeldung wird angezeigt. Es stürzt sofort @ceros –