CreateFileMapping(...) :: ERROR_FILE_INVALID ??

Тема в разделе "WASM.BEGINNERS", создана пользователем UTeX, 19 окт 2007.

  1. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Код (Text):
    1. FMapObject::FMapObject(LPSTR FileName, DWORD CreationDisposition)
    2. {
    3.     hCreateFile = CreateFileA(FileName,
    4.                             GENERIC_READ|GENERIC_WRITE,
    5.                             FILE_SHARE_READ,
    6.                             NULL,
    7.                             CreationDisposition,
    8.                             FILE_ATTRIBUTE_NORMAL,
    9.                             NULL);
    10.     hFileMapping = CreateFileMapping(hCreateFile, NULL, PAGE_READWRITE, 0, 0, 0);
    11.     DWORD i = GetLastError(); // 1006 :: ERROR_FILE_INVALID
    12.     lpViewOfFile = MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
    13.     i = GetLastError();
    14. }
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    GetLastError следует вызывать только если CreateFileMapping вернула ошибку
     
  3. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    я бы делал приблизительно так

    Код (Text):
    1. BOOL MapFile(MAPPED_FILE_INFO* lpmfi)
    2. {
    3.     lpmfi->hFile = CreateFile(lpmfi->FileName, lpmfi->dwDesiredAccessForCreateFile,
    4.                               FILE_SHARE_READ, 0, OPEN_EXISTING,
    5.                               FILE_ATTRIBUTE_NORMAL, 0);
    6.     if ( lpmfi->hFile == INVALID_HANDLE_VALUE ) return FALSE;
    7.     lpmfi->hMapFile = CreateFileMapping(lpmfi->hFile, NULL, lpmfi->flProtect, 0, 0, NULL);
    8.     if ( lpmfi->hMapFile )
    9.     {
    10.         lpmfi->lpMapMemory = MapViewOfFile(lpmfi->hMapFile, lpmfi->dwDesiredAccessForMapViewOfFile, 0, 0, 0);
    11.         if ( lpmfi->lpMapMemory ) return TRUE;
    12.         CloseHandle(lpmfi->hMapFile);
    13.     }
    14.     CloseHandle(lpmfi->hFile);
    15.     return FALSE;
    16. }
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    ответ на поставленный вопрос:
    В случае если функция не возвращала ошибку значение GetLastError может быть каким угодно
     
  6. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
  7. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    CREATE_ALWAYS + CreateFileMapping(hCreateFile, NULL, PAGE_READWRITE, 0, 0, 0);?
    Попробуй размер выставить больше нуля.
     
  8. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    UTeX
    Не всегда. Чаще всего last error выставляется только если была ошибка. Соответственно, если ошибки не было, то остаётся прежнее значение.
     
  10. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    для данной конкретной функции вот что написано
    Код (Text):
    1. If the function succeeds, the return value is a handle to the file-mapping object.
    2. If the object existed before the function call, the GetLastError function returns
    3. ERROR_ALREADY_EXISTS, and the return value is a valid handle to the existing
    4. file-mapping object (with its current size, not the new specified size. If the mapping object
    5. did not exist, GetLastError returns zero.
    6. If the function fails, the return value is NULL. To get extended error information, call GetLastError.