2016-06-07 12 views
-1

Ich muss mmap einer Datei erstellen. Da Windows mmap nicht unterstützt, habe ich die MapViewOfFile() Methode ausprobiert. Aber das scheitert.Windows c: konnte nicht erstellt werden mmap einer Datei

Hier ist mein Code:

char template[1024]; 
snprintf(template, sizeof(template)/sizeof(char), "%s", "C:\\Users\\Ijas\\Downloads\\ijas.txt"); 

HANDLE hfile = CreateFile(template, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, NULL); 

if (hfile == INVALID_HANDLE_VALUE) 
{ 
    fprintf(stderr, "CreateFile() error 0x%08x \n", GetLastError()); 
    return NULL; 
} 

HANDLE map_handle = CreateFileMapping(hfile, NULL, PAGE_READWRITE | SEC_RESERVE, 0, 0, 0); 
if (map_handle == NULL) 
{ 
    fprintf(stderr, "CreateFileMapping() error 0x%08x\n", GetLastError()); 
    CloseHandle(hfile); 
    return NULL; 

} 

sp = (char*)MapViewOfFile(map_handle, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, 0); 

if (sp->buffer == NULL) 
{ 
    fprintf(stderr, "MapViewOfFile() error 0x%08x\n", GetLastError()); 
    CloseHandle(hMapFile); 
    CloseHandle(hfile); 
    return NULL; 
} 

Ausgang:

CreateFile() error 0x00000003 

Hinweis: Vorlage ist eine vorhandene Datei.

Alles falsch in meinem Code? Bitte hilf mir?

+0

Hat 'ijas.txt' existiert? Sie sollten [GetLastError] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms679360 (v = vs.85) .aspx) aufrufen, um zu sehen, was beim Funktionsaufruf passiert ist. – LPs

+0

Wenn ein Windows-Systemaufruf fehlschlägt, sollten Sie ['GetLastError'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms679360 (v = vs.85) .aspx) finden Was [der Fehler] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms681381 (v = vs.85) .aspx) ist. –

+0

@JoachimPileborg Ich habe meinen Code und Ausgabe mit GetLastError bearbeitet –

Antwort

2

Wie in den Kommentaren diskutiert, mit verschiedenen Möglichkeiten des Try-and-Hits, scheint das Problem mit Unicode und Ansi zu sein. template wird als char* deklariert, wird aber an CreateFile übergeben, die standardmäßig CreateFileW aufruft. Wenn OP den Code mit dem C++ - Compiler kompiliert hätte, hätte der Compiler darüber geklagt, aber beim C-Compiler stützte er sich nur auf den Intellekt des Coders.

CreateFileA erwartet const char* während CreateFileW erwartet const wchar_t*

+0

Gut. Sehr deutlich. Thx – LPs

+1

@LPs - Wenn ich kann, hätte ich Punkte mit Ihnen geteilt. Sie haben nur mehr als die Hälfte der Fehlermöglichkeiten ausgeschlossen und das Problem eingegrenzt. – Abhineet