Хочу спроецировать файл в пямять следующим образом: Код (Text): size_t *len; unsigned char **buffer; unsigned char *pStart; LPTSTR pBuf; DWORD dwSize; HANDLE hFile; HANDLE hMap; hFile = CreateFile( "test.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (INVALID_HANDLE_VALUE == hFile) { fprintf (stderr, "Unable to open file\n"); return 0; } dwSize = GetFileSize (hFile, NULL); hMap = CreateFileMapping( hFile, NULL, PAGE_READONLY, 0, 0, NULL); if (NULL == hMap) { fprintf (stderr, "Unable to create map file\n"); CloseHandle(hFile); return 0; } pStart = MapViewOfFile( hMap, FILE_MAP_READ, 0, 0, 0); if (NULL == pStart) { fprintf (stderr, "Unable to map file into memory\n"); CloseHandle(hMap); CloseHandle(hFile); return 0; } CloseHandle(hMap); CloseHandle(hFile); Компилятор ругается на функцию MapViewOfFile, говорит следующее [C++ Error] Unit1.cpp(53): E2034 Cannot convert 'void *' to 'unsigned char *', а в MSDN написано что данная функция должна вернуть адрес начала спроецированного файла. И там же есть пример: Код (Text): LPCTSTR pBuf; --------------- pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object FILE_MAP_ALL_ACCESS, // read/write permission 0, 0, BUF_SIZE); и в pbBuf оказывается содержание файла, а не адрес!!!
а кто же знает че у тя в файле то хранится вот и возвращается указатель на область памяти(void*), если ты уверен что там текст то сделай явное преобразование как в примере Код (Text): pStart = (LPTSTR)MapViewOfFile(...
LLInuoH в файле может быть что угодно, и я хочу получить указатель на облать памяти а не данные из этого файла! что получается если сделать так как вы предложили!
Код (Text): LPVOID MapViewOfFile( HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap ); Код (Text): LPVOID lpMapAddress; lpMapAddress = MapViewOfFile(hMapFile, // handle to mapping object FILE_MAP_ALL_ACCESS, // read/write permission 0, // max. object size 0, // size of hFile 0); // map entire file if (lpMapAddress == NULL) { ErrorHandler("Could not map view of file."); }
Keva MapViewOfFile возвращает базовый адрес, который в списке VAD процесса закреплен за проекцией вида данного файла. Другими словами, когда ты первый раз захочешь обратиться по данному адресу, операционная система автоматически прочитает содержимое файла и предоставит тебе эти данные. Происходит это следующим образом: Код (Text): char* data = (char*) MapViewOfFile( ..... ); if( data ) { printf("Some error occurred\n"); ... } char ch; ch = *(data++); // читаем первый раз, инициируется чтение из файла. в ch в итоге попадает первый байт файла ch = *(data++); // читаем второй байт, данные предоставляются из памяти из уже прочтенной страницы. ch = *(data + 0x9000); // читаем из десятой страницы, ее в памяти нет, снова инициируется чтение файла. UnmapViewOfFile( data ) твоя ошибка: MapViewOfFile возвращает неопределенный указатель (void*), т.к. она не знает, какого типа в файле данные. Поэтому тебе нужно самостоятельно привести указатель к нужному типу: pStart = (unsigned char*) MapViewOfFile(
Keva все правильно в мсдн написано - возвращается void*, начало памяти, я не знаю что slow имел в виду