Проецирование файла в память

Тема в разделе "LANGS.C", создана пользователем Keva, 12 сен 2007.

  1. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    Хочу спроецировать файл в пямять следующим образом:
    Код (Text):
    1. size_t  *len;
    2.         unsigned char **buffer;
    3.         unsigned char *pStart;
    4.         LPTSTR         pBuf;
    5.         DWORD dwSize;
    6.         HANDLE hFile;
    7.         HANDLE hMap;
    8.  
    9.  
    10.         hFile = CreateFile(
    11.                 "test.txt",
    12.                 GENERIC_READ,
    13.                 0,
    14.             NULL,
    15.                 OPEN_EXISTING,
    16.                 FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,
    17.             NULL);
    18.  
    19.         if (INVALID_HANDLE_VALUE == hFile)
    20.         {
    21.             fprintf (stderr, "Unable to open file\n");
    22.             return 0;
    23.         }
    24.  
    25.         dwSize = GetFileSize (hFile, NULL);
    26.  
    27.         hMap = CreateFileMapping(
    28.                 hFile,
    29.                 NULL,
    30.                 PAGE_READONLY,
    31.                 0,
    32.                 0,
    33.                 NULL);
    34.  
    35.         if (NULL == hMap)
    36.         {
    37.             fprintf (stderr, "Unable to create map file\n");
    38.             CloseHandle(hFile);
    39.             return 0;
    40.         }
    41.  
    42.         pStart = MapViewOfFile(
    43.                 hMap,
    44.                 FILE_MAP_READ,
    45.                 0,
    46.                 0,
    47.                 0);
    48.  
    49.         if (NULL == pStart)
    50.         {
    51.             fprintf (stderr, "Unable to map file into memory\n");
    52.             CloseHandle(hMap);
    53.             CloseHandle(hFile);
    54.             return 0;
    55.         }
    56.  
    57.  
    58.         CloseHandle(hMap);
    59.         CloseHandle(hFile);
    Компилятор ругается на функцию MapViewOfFile, говорит следующее [C++ Error] Unit1.cpp(53): E2034 Cannot convert 'void *' to 'unsigned char *', а в MSDN написано что данная функция должна вернуть адрес начала спроецированного файла. И там же есть пример:
    Код (Text):
    1. LPCTSTR pBuf;
    2. ---------------
    3. pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
    4.                FILE_MAP_ALL_ACCESS,  // read/write permission
    5.                0,                    
    6.                0,                    
    7.                BUF_SIZE);
    и в pbBuf оказывается содержание файла, а не адрес!!!
     
  2. LLInuoH

    LLInuoH New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2006
    Сообщения:
    15
    а кто же знает че у тя в файле то хранится вот и возвращается указатель на область памяти(void*), если ты уверен что там текст то сделай явное преобразование как в примере
    Код (Text):
    1. pStart = (LPTSTR)MapViewOfFile(...
     
  3. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    LLInuoH
    в файле может быть что угодно, и я хочу получить указатель на облать памяти а не данные из этого файла! что получается если сделать так как вы предложили!
     
  4. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Код (Text):
    1. LPVOID MapViewOfFile(
    2.   HANDLE hFileMappingObject,
    3.   DWORD dwDesiredAccess,
    4.   DWORD dwFileOffsetHigh,
    5.   DWORD dwFileOffsetLow,
    6.   SIZE_T dwNumberOfBytesToMap
    7. );
    Код (Text):
    1. LPVOID lpMapAddress;
    2. lpMapAddress = MapViewOfFile(hMapFile, // handle to mapping object
    3.     FILE_MAP_ALL_ACCESS,               // read/write permission
    4.     0,                                 // max. object size
    5.     0,                                 // size of hFile
    6.     0);                                // map entire file
    7.  
    8. if (lpMapAddress == NULL)
    9. {
    10.     ErrorHandler("Could not map view of file."); }
     
  5. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Keva
    MSDN у тебя явно старый.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Keva
    MapViewOfFile возвращает базовый адрес, который в списке VAD процесса закреплен за проекцией вида данного файла. Другими словами, когда ты первый раз захочешь обратиться по данному адресу, операционная система автоматически прочитает содержимое файла и предоставит тебе эти данные.
    Происходит это следующим образом:

    Код (Text):
    1. char* data = (char*) MapViewOfFile( ..... );
    2. if( data ) {
    3.   printf("Some error occurred\n");
    4.   ...
    5. }
    6.  
    7. char ch;
    8.  
    9. ch = *(data++); // читаем первый раз, инициируется чтение из файла. в ch в итоге попадает первый байт файла
    10. ch = *(data++); // читаем второй байт, данные предоставляются из памяти из уже прочтенной страницы.
    11. ch = *(data + 0x9000); // читаем из десятой страницы, ее в памяти нет, снова инициируется чтение файла.
    12.  
    13. UnmapViewOfFile( data )
    твоя ошибка:
    MapViewOfFile возвращает неопределенный указатель (void*), т.к. она не знает, какого типа в файле данные. Поэтому тебе нужно самостоятельно привести указатель к нужному типу:

    pStart = (unsigned char*) MapViewOfFile(
     
  7. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    slow
    http://msdn2.microsoft.com/en-us/library/aa366551.aspx я здесь смотрел. Это старый MSDN?
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Keva
    все правильно в мсдн написано - возвращается void*, начало памяти, я не знаю что slow имел в виду
     
  9. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    Great
    Благодарю!