2016-06-07 2 views
-1

Je dois créer mmap d'un fichier. Puisque windows ne supporte pas mmap, j'ai essayé la méthode MapViewOfFile(). Mais cela échoue.Windows c: impossible de créer mmap d'un fichier

Voici mon 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; 
} 

Sortie:

CreateFile() error 0x00000003 

Astuce: modèle est un fichier existant.

Quelque chose ne va pas dans mon code? Sil te plait aide moi?

+0

Est-ce que 'ijas.txt' existe? Vous devriez appeler [GetLastError] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms679360 (v = vs.85) .aspx) pour voir ce qui s'est mal passé avec l'appel de fonction. – LPs

+0

Lorsqu'un appel système Windows échoue, vous devez utiliser ['GetLastError'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms679360 (v = vs.85) .aspx) pour rechercher ce que [l'erreur] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms681381 (v = vs.85) .aspx) est. –

+0

@JoachimPileborg J'ai modifié mon code et sortie avec GetLastError –

Répondre

2

Comme discuté dans les commentaires, avec diverses possibilités de try-and-hit, le problème semble être avec Unicode et Ansi. template est déclaré char* mais est passé à CreateFile qui appelle par défaut CreateFileW. Si OP aurait compilé le code avec le compilateur C++, le compilateur se serait plaint à ce sujet mais avec le compilateur C, cela dépendait seulement de l'intellect du codeur.

CreateFileAconst char* alors que CreateFileW attend attend const wchar_t*

+0

Bon. Très clair. Thx – LPs

+1

@LPs - Si je peux, j'aurais partagé des points avec vous. Vous avez exclu seulement plus de la moitié des possibilités d'erreur et réduit le problème. – Abhineet