Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > проблема с мап-файлом


Автор: tilser 21.4.2008, 21:13
Код

struct header
{
    int m_size;
    int m_address;
};

void WriteToMapFile(CString text, int numb, HANDLE &hFileMap)
{
    header h;
    h.m_size = text.GetLength() + 1;
    h.m_address = numb;
    hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(header) + h.m_size, "Global\\Data"); 
    BYTE *pBuff = (BYTE*)MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(header));
    memcpy(pBuff, &h, sizeof(header));
    UnmapViewOfFile(pBuff);
    pBuff = (BYTE*)MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, sizeof(header), 0);
    memcpy(pBuff, text.GetString(), h.m_size);
    UnmapViewOfFile(pBuff);
    CloseHandle(hFileMap);
}

На строчке memcpy(pBuff, text.GetString(), h.m_size) выдает Access violation.
Ошибка наверное в параметрах. которые передаю в MapViewOfFile. но не могу понять какая.

Автор: 586 21.4.2008, 21:30
Что GetLastError говорит?

Автор: Earnest 22.4.2008, 11:33
Цитата(tilser @  21.4.2008,  22:13 Найти цитируемый пост)
  pBuff = (BYTE*)MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, sizeof(header), 0);

Строка, надо полагать, длиннее чем размер хедера.
И вообще, незачем постоянно map-unmap делать - это не быстрые операции. Делай один раз на все данные.

Автор: xvr 22.4.2008, 11:44
Цитата(tilser @ 21.4.2008,  21:13)
[code=cpp]
struct header
{
    int m_size;
    int m_address;
};

void WriteToMapFile(CString text, int numb, HANDLE &hFileMap)
{
    header h;
    h.m_size = text.GetLength() + 1;
    h.m_address = numb;
    hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(header) + h.m_size, "Global\\Data"); 

Запрошен мэпинг на размер заголовка + данные (sizeof(header) + h.m_size)
Цитата

Код

    BYTE *pBuff = (BYTE*)MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(header));
    memcpy(pBuff, &h, sizeof(header));
    UnmapViewOfFile(pBuff);

Замэплен заголовок с начала файла, заполнен

Цитата

Код

    pBuff = (BYTE*)MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, sizeof(header), 0);
    memcpy(pBuff, text.GetString(), h.m_size);
    UnmapViewOfFile(pBuff);
    CloseHandle(hFileMap);
}

Снова замэплен заголовок с начала файла, и перезаписан данными (явно большей длинны, чем заголовок)
Цитата

На строчке memcpy(pBuff, text.GetString(), h.m_size) выдает Access violation.
Неудивительно
Цитата

Ошибка наверное в параметрах. которые передаю в MapViewOfFile. но не могу понять какая.
Угу, надо мэпить сразу все и записывать в один прием. Замэпить только данные не получится - файловой смещение должно быть кратно размеру страницы (4К)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)