Russian Qt Forum
Ноябрь 23, 2024, 07:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Глюк QT 3.3.0 ?  (Прочитано 10778 раз)
c++
Гость
« : Май 03, 2004, 23:45 »

Сразу скажу, что я в QT мало чего понимаю, но вот с какой проблемой я столкнулся (я использую среду MS VS 2003 .NET).
Есть приложение на QT (в смысле происходит линковка через qt-mt330.lib и qtmain.lib, а никакой функциональности QT даже не задействовано, только линковка!), в котором используется win32 функция MapViewOfFile(). В коде используется функция main(), но в настройках проекта (Linker->System->Subsystem) установлено /SUBSYSTEM:WINDOWS. Вообще, такой код не должен нормально линковаться (естественно, не будет найденa _WinMain@16), но если в настройках проекта (Linker->Input->Additional Dependencies) стоят mt330.lib и qtmain.lib, то все линкуется (кстати, кто знает, как это происходит Непонимающий?). Так вот, глюк заключается в том, что при достаточно большом размере файла, который мэппится (около 1.5 Гб), функция MapViewOfFile() возвращает 0! (с маленькими файлами все нормально). А если поставить как вообще положено флаг в настройках проекта /SUBSYSTEM:CONSOLE, то все нормально. Точно не знаю, но вроде бы при линковке с QT 3.0.0 такого не происходит.
В чем здесь проблема? С неправильной инициализацией CRT, которую, видимо, в случае флага /SUBSYSTEM:WINDOWS неправильно выполняет QT в функции CRTMainStartUp или как-то такое название, не помню...
Кстати, интересный момент. Если использовать функцию WinMain() и настройку /SUBSYSTEM:WINDOWS, все линкуется, и файл нормально мэппится, а вот если WinMain() и настройка /SUBSYSTEM:CONSOLE - даже не линкуется... Это видимо QT не поддерживает (и правильно делает, а то вообще хаос какой-то Улыбающийся )
Thanx.
Записан
EugeneVC
Гость
« Ответ #1 : Май 04, 2004, 00:38 »

раскажи а зачем тебе вообще qt в проекте
ты же его не используешь
Записан
c++
Гость
« Ответ #2 : Май 07, 2004, 12:55 »

Ситуация следующая.
Конечно, есть большой проект, в котором много чего на qt написано. Вот в нем и не работает мэппинг больших файлов. Я стал выяснять, почему. Сначала сразу в начале функции main() закомментарил все, сделал в ней ТОЛЬКО мэппинг. Не помогло. Далее, удалил вообще все из проекта. Тоже не помогло! Естественно, остался вариант только с настройками проекта. Вот его в предыдущем сообщении я и описывал, т.е. никакая функциональность qt не используется, но линковка есть.
Кстати, можешь сам попробовать. Даже интересно, что получится.
Thanx.
P.S. Напомню, речь идет о QT 3.3.0, откомпилированной VC 7.0
Записан
EugeneVC
Гость
« Ответ #3 : Май 07, 2004, 13:04 »

а скинь ка сюда кусочки кода
а то я с мапингом не работал никогда
Записан
c++
Гость
« Ответ #4 : Май 08, 2004, 13:47 »

Вот примерный код функции main():
Код:

int main()
{
   HANDLE hFile;
   HANDLE hMapFile;
   void* mapped;
 
   //Сюда запиши путь к своему файлу от 1.4 Гб веса :))
   char filename[500];

   hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ,
                     NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
   if(hFile == INVALID_HANDLE_VALUE) return -1;

   hMapFile = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
   if(hMapFile == NULL)
   {
      CloseHandle(hFile);
      return -1;
   }

   //Вот здесь на большом файле возвращается NULL!!!!
   mapped = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
   if(mapped == NULL)
   {
       CloseHandle(hFile);
       CloseHandle(hMapFile);
       return -1;
   }

   CloseHandle(hFile);
   CloseHandle(hMapFile);
   UnmapViewOfFile(mapped);

   return 0;
}

Не забудь:
Linker->Input->Additional Dependencies поставить qt-mt330.lib и qtmain.lib
Linker->System->Subsystem поставить /SUBSYSTEM:WINDOWS

Должно быть mapped == 0. А затем переставь /SUBSYSTEM:CONSOLE - должно заработать!
Интересно, что у тебя получится.
Thanx.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 20.