Код (Text): FMapObject::FMapObject(LPSTR FileName, DWORD CreationDisposition) { hCreateFile = CreateFileA(FileName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL, CreationDisposition, FILE_ATTRIBUTE_NORMAL, NULL); hFileMapping = CreateFileMapping(hCreateFile, NULL, PAGE_READWRITE, 0, 0, 0); DWORD i = GetLastError(); // 1006 :: ERROR_FILE_INVALID lpViewOfFile = MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0); i = GetLastError(); }
я бы делал приблизительно так Код (Text): BOOL MapFile(MAPPED_FILE_INFO* lpmfi) { lpmfi->hFile = CreateFile(lpmfi->FileName, lpmfi->dwDesiredAccessForCreateFile, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if ( lpmfi->hFile == INVALID_HANDLE_VALUE ) return FALSE; lpmfi->hMapFile = CreateFileMapping(lpmfi->hFile, NULL, lpmfi->flProtect, 0, 0, NULL); if ( lpmfi->hMapFile ) { lpmfi->lpMapMemory = MapViewOfFile(lpmfi->hMapFile, lpmfi->dwDesiredAccessForMapViewOfFile, 0, 0, 0); if ( lpmfi->lpMapMemory ) return TRUE; CloseHandle(lpmfi->hMapFile); } CloseHandle(lpmfi->hFile); return FALSE; }
ответ на поставленный вопрос: В случае если функция не возвращала ошибку значение GetLastError может быть каким угодно
CREATE_ALWAYS + CreateFileMapping(hCreateFile, NULL, PAGE_READWRITE, 0, 0, 0);? Попробуй размер выставить больше нуля.
UTeX Не всегда. Чаще всего last error выставляется только если была ошибка. Соответственно, если ошибки не было, то остаётся прежнее значение.
для данной конкретной функции вот что написано Код (Text): If the function succeeds, the return value is a handle to the file-mapping object. If the object existed before the function call, the GetLastError function returns ERROR_ALREADY_EXISTS, and the return value is a valid handle to the existing file-mapping object (with its current size, not the new specified size. If the mapping object did not exist, GetLastError returns zero. If the function fails, the return value is NULL. To get extended error information, call GetLastError.