2016-06-07 131 views
-1

我需要創建文件的mmap。由於Windows不支持mmap,我嘗試過MapViewOfFile()方法。但是這失敗了。windows c:無法創建文件的mmap

這裏是我的代碼:

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

輸出:

CreateFile() error 0x00000003 

提示:模板是現有文件。

我的代碼有什麼問題嗎?請幫助我?

+0

是否'ijas.txt'存在?您應該調用[GetLastError](https://msdn.microsoft.com/en-us/library/windows/desktop/ms679360(v = vs.85).aspx)來查看函數調用出了什麼問題。 – LPs

+0

當Windows系統調用失敗時,應該使用['GetLastError'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms679360(v = vs.85).aspx)來查找什麼[錯誤](https://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v = vs.85).aspx)是。 –

+0

@JoachimPileborg我已經編輯我的代碼和輸出與GetLastError函數 –

回答

2

正如在評論中所討論的那樣,有各種各樣的嘗試和打擊的可能性,問題似乎與UnicodeAnsitemplate被宣佈爲char*,但被傳遞給CreateFile,默認情況下該電話號碼爲CreateFileW。如果OP會用C++編譯器編譯代碼,編譯器會抱怨這個,但是使用C編譯器,它只是依靠編碼器的智力。

CreateFileA預計const char*CreateFileW預計const wchar_t*

+0

好。非常清楚。 Thx – LPs

+1

@LPs - 如果可以的話,我會和你分享點數。你只排除了超過一半的錯誤可能性並縮小了問題範圍。 – Abhineet