Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с мап-файлом 
V
    Опции темы
tilser
Дата 21.4.2008, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 30.1.2007

Репутация: нет
Всего: нет



Код

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. но не могу понять какая.
PM MAIL   Вверх
586
Дата 21.4.2008, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Что GetLastError говорит?
PM   Вверх
Earnest
Дата 22.4.2008, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



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

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


--------------------
...
PM   Вверх
xvr
Дата 22.4.2008, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(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К)


Это сообщение отредактировал(а) xvr - 22.4.2008, 11:44
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0482 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.