Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка версии файла. как можно узнать версию файла  
:(
    Опции темы
Sality123
Дата 7.2.2012, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем привет. Вот возник вопрос как узнать например версию Qt шной дллки, либо же моего исполняемого файла. Как добавить версию файлу через файл ресурсов я знаю, а вот как програмно его считать? Это мне нужно для updatera

заранее спс.
PM MAIL   Вверх
null56
Дата 7.2.2012, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну компилтайм версия Qt доступна через макрос QT_VERSION
Для экспорта каких - либо символов из либы можно попробовать использовать методы класса QLibrary
например:
Код

void * QLibrary::resolve ( const char * symbol )

допустим при сборке либы ты указываешь значение макроса QT_VERSION в качестве экпорта, а при загрузке либы читаешь значение этого параметра
думаю, это реализуемо

Добавлено через 1 минуту и 46 секунд
надеюсь я правильно понял задуманное тобой
PM MAIL   Вверх
Sality123
Дата 7.2.2012, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Дело в том, что ОС пишет под названием файла его версию. Видно каким то образом она достает эти данные. Мне кажется должно быть что-то типо QFileInfo в котором все данные о файле.
PM MAIL   Вверх
borisbn
Дата 7.2.2012, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вот, делал как-то для венды. Там повсюду используется AnsiString из VCL, но, думаю, переделать на std::string - не проблема
Код

AnsiString __stdcall VCLUtils::FileVersion_2_String(const AnsiString fileName, BOOL useBuild)
{
  DWORD dwHandle, sz = GetFileVersionInfoSize(fileName.c_str(), &dwHandle);
  if ( 0 == sz )
  {
    return "";
  }
  BYTE *buf = new BYTE[sz];
  if ( !GetFileVersionInfo(fileName.c_str(), dwHandle, sz, buf) )
  {
    delete []buf;
    return "";
  }
  VS_FIXEDFILEINFO *pvi;
  sz = sizeof(VS_FIXEDFILEINFO);
  if ( !VerQueryValue(buf, "\\", (LPVOID*)&pvi, (unsigned int*)&sz) )
  {
    delete []buf;
    return "";
  }
  AnsiString version = AnsiString(pvi->dwFileVersionMS >> 16    ) + "." +
                       AnsiString(pvi->dwFileVersionMS &  0xFFFF) + "." +
                       AnsiString(pvi->dwFileVersionLS >> 16);
  if ( useBuild )
  {
    version = version + "." + AnsiString(pvi->dwFileVersionLS & 0xFFFF);
  }
  delete []buf;
  return version;
}



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


Шустрый
*


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

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



Оно еще и платформо зависимое? Жаль я думал в ку-те реализовали обертку. Тоесть нужно писать отдельно реализацию под линукс и винду? ((
PM MAIL   Вверх
Amp
Дата 7.2.2012, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Sality123 @  7.2.2012,  13:40 Найти цитируемый пост)
Оно еще и платформо зависимое? Жаль я думал в ку-те реализовали обертку. Тоесть нужно писать отдельно реализацию под линукс и винду? (( 

В линуксе у исполняемых файлов нет версий, прописанных в них же. Вообще странные шаманства, версию программы можно хранить в любом другом месте - хоть в текстовом файле, хоть прямо задавать в коде через QCoreApplication::setApplicationVersion, генерируя значение версии в pre-build-е в каком-нибудь version.h.

Это сообщение отредактировал(а) Amp - 7.2.2012, 18:30
PM MAIL   Вверх
Sality123
Дата 7.2.2012, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну задать то версию не сложно а вот как ее потом считать?))) единственный кросплатформенный способ это хранить версии отдельно. Хотя опять же интересно как работает Qt ный апдейтер. Ведь он та определяет версии либ сустановленых на компе и если они старые перекачивает. как думаете версии хронит гдето отдельно или всетаки пробегается по файлам и проверяет??
PM MAIL   Вверх
Amp
Дата 7.2.2012, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Sality123 @  7.2.2012,  19:10 Найти цитируемый пост)
Ну задать то версию не сложно а вот как ее потом считать?)

Так оно уже в коде есть в какой-нибудь переменной типа QString. Апдейтер, либо само приложение, лишь сравнивает зашитое значение и полученное с сервера. 

Как работает QtSDK не знаю. Можно конечно посмотреть его исходники, если есть время и желания https://qt.gitorious.org/installer-framework
PM MAIL   Вверх
math64
Дата 7.2.2012, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Можно хранить информацию в виде базы данных, применительно к Qt - лучше sqlite - обычно драйвер для неё всегда есть.
Но учти: При установке Qt в файл QtCore4.dll и некотроые другие прописываются пути установки, так что на разных компьютерах они могут различаться, даже при одной и той же версии Qt.

PM   Вверх
Sality123
Дата 9.2.2012, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Amp @  7.2.2012,  20:23 Найти цитируемый пост)
Так оно уже в коде есть в какой-нибудь переменной типа QString. Апдейтер, либо само приложение, лишь сравнивает зашитое значение и полученное с сервера. 


Интересно как апдейтер может получить данные какой то там переменной у другого приложения)))  Вобщем кому интересно, решил сделать вот так. 

Беру хеш всех файлов программы и записываю в .ini и любая прога при старте берет эти данные и отправляет на сервер. Если версии не совпадают сервер говорит что нужно обновить и соответсвено после обновления обновляется хеш.

Дешево и сердито =)
PM MAIL   Вверх
borisbn
Дата 9.2.2012, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Sality123 @  9.2.2012,  13:26 Найти цитируемый пост)
Беру хеш всех файлов программы и записываю в .ini


Цитата(math64 @  7.2.2012,  20:40 Найти цитируемый пост)
 При установке Qt в файл QtCore4.dll и некотроые другие прописываются пути установки




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


Шустрый
*


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

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



Цитата(borisbn @  9.2.2012,  14:13 Найти цитируемый пост)
Цитата(Sality123 @  9.2.2012,  13:26 )
Беру хеш всех файлов программы и записываю в .ini


Цитата(math64 @  7.2.2012,  20:40 )
 При установке Qt в файл QtCore4.dll и некотроые другие прописываются пути установки




--------------------



я не спец в этом, но чисто логически это попахивает бредом ;) зачем в либе путь где она установлена?? оО чтоб потом ее нельзя было перенести на другую машину? )))
PM MAIL   Вверх
borisbn
Дата 9.2.2012, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Sality123 @  9.2.2012,  15:38 Найти цитируемый пост)
зачем в либе путь где она установлена?

хз. сам не понимаю, но, я посмотрел в своей - там действительно путь к C:\Qt\4.6.2

Это сообщение отредактировал(а) borisbn - 9.2.2012, 15:41


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


Шустрый
*


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

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



хм.. тоже в своей нашел какие то пути... это просто походу дописано как статическая информация. Возможно нужно для компиляции... да.. для хеша не пойдет тада...


а чо не пойдет... какая разница чо в ддлке, яж ее хеш беру. у меня то она не поменяется в апдейт-хранилище на сервере. это текущие ддлки при компиляции могут менятся.

Это сообщение отредактировал(а) Sality123 - 9.2.2012, 15:57
PM MAIL   Вверх
Amp
Дата 9.2.2012, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Sality123 @  9.2.2012,  13:26 Найти цитируемый пост)
Интересно как апдейтер может получить данные какой то там переменной у другого приложения)))  Вобщем кому интересно, решил сделать вот так. 

Например:

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

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

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


 




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


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

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