Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Memory Mapped File в Win на Qt, Особенности? В лоб не работает... 
:(
    Опции темы
Ground
  Дата 28.6.2011, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 27.2.2006
Где: Комсомольск

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



Доброго времени суток!
Подскажите как правильно реализовать механизм отображения файла в память под Win32 на Qt 4.7. Гугление ничего толкового не дает, отсылает к методу map  класса QFile. Но при такой реализации ничего не работает.
Сам файл уже существует, его нужно только открыть, права к нему имеются - на чтение. С помощью WinAPI проверял - все работает, но в Qt с этим проблемы. Делаю вот так:
Код

    Qfile file = new QFile(QString(Global\\DataFile_001.mkio));
    if(!file->open(QIODevice::ReadOnly))
      QMessageBox::information(0, "Error", "Error");

    qint64 size = file->size();
    unsigned char *mmf = file->map(0, size);

При таком коде open() возвращает false, файл не виден. file->exists() возвращает false.

В чем может быть проблема? Возможно имеются какие-то особенности работы с такими файлами? 

Это сообщение отредактировал(а) Ground - 28.6.2011, 07:59
PM MAIL ICQ   Вверх
borisbn
Дата 28.6.2011, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Ground @  28.6.2011,  06:49 Найти цитируемый пост)
При таком коде open() возвращает false, файл не виден. file->exists() возвращает false.

при чём тут map совершенно не понятно...
дай ему (QFile'у) полный путь к файлу. Если всё пройдёт, то проблема в том, что ты считаешь, что exe-шник запущен из одного каталога, а он (exe-шник) считает, что в другом.

Цитата(Ground @  28.6.2011,  06:49 Найти цитируемый пост)
 Qfile file = new QFile(QString(Global\\DataFile_001.mkio));

я так понимаю, что здесь когда-то были кавычки ? smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Ground
Дата 28.6.2011, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 27.2.2006
Где: Комсомольск

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



Цитата(borisbn @  28.6.2011,  15:24 Найти цитируемый пост)
я так понимаю, что здесь когда-то были кавычки ? 

Да, кавычки были, по запарке забыл их сюда скопировать.

Цитата(borisbn @  28.6.2011,  15:24 Найти цитируемый пост)
при чём тут map совершенно не понятно...дай ему (QFile'у) полный путь к файлу. Если всё пройдёт, то проблема в том, что ты считаешь, что exe-шник запущен из одного каталога, а он (exe-шник) считает, что в другом.

У файла нет физической копии, он был создан в сторонней программе средствами WinAPI. Помечен как Memory Mapped File в Global пространстве имен с именем DataFile_001.mkio.


PM MAIL ICQ   Вверх
borisbn
Дата 28.6.2011, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



QFile работает через CreateFile, а Memory Mapped File нужно открывать OpenFileMapping
Не пробовал, но может сработать
Код

HANDLE hFile = OpenFileMapping(...);
int handle = _open_osfhandle((LONG)hFile, _mode);
QFile file;
file.open( handle, QIODevice::ReadOnly );



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Ground
Дата 28.6.2011, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 27.2.2006
Где: Комсомольск

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



borisbn, спасибо за толковую идею, но _open_osfhandle возвращает -1. Наверное это даже к лучшему - такие преобразования до добра не доведут. Скорее всего буду добавлять WinAPI в чистом виде, раз уж других способов нет.

А вопрос пусть повисит пока, может быть кто-нибудь предложит другие идеи.

Это сообщение отредактировал(а) Ground - 28.6.2011, 09:41
PM MAIL ICQ   Вверх
borisbn
Дата 28.6.2011, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Ground @  28.6.2011,  09:35 Найти цитируемый пост)
_open_osfhandle возвращает -1

скорее всего, так и должно было быть, т.к. рез-тат OpenFileMapping это не файловый HANDLE

Цитата(Ground @  28.6.2011,  09:35 Найти цитируемый пост)
Наверное это даже к лучшему - такие преобразования до добра не доведут

 smile 
согласен на 100 %. 

Цитата(Ground @  28.6.2011,  09:35 Найти цитируемый пост)
Скорее всего буду добавлять WinAPI в чистом виде, раз уж других способов нет.

мысля пришла: наследуйся от QIODevice ! В дальнейшем можешь использовать класс практически как QFile  smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

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


 




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


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

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