Russian Qt Forum

Qt => Уроки и статьи => Тема начата: lesav от Август 10, 2011, 11:02



Название: Qt MinGW: Добавление информации в бинарный файл (иконка, версия и т.д.)
Отправлено: lesav от Август 10, 2011, 11:02
Иногда необходимо добавить информацию в приложение: версия, наименование програмного продукта, копирайт и т.д.
Это просто сделать добавив файл описания .rc

Проблемы возникают если в программном комплексе несколько исполняемых файлов. Приходиться "слонятся" по директориям проекта в поисках .rc файлов и монотонное редактирование.

Для решения этой проблеммы необходимо создать файлы .rc для каждого приложения примерно такого содержания

Файл rc_info.rc кодировка cp1251
Код:
#include <winuser.h>
#include <winnt.h>

#define stringify(v1) #v1
#define quote(v1)  stringify(v1)

#define NVER  NVER1.NVER2.NVER3.NVER4

LANGUAGE 25,1

STRINGTABLE LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
BEGIN
        1 "Программный комплекс РТК-07 ""ТАЙФУН""\0"
END
IDI_ICON1       ICON    DISCARDABLE     "img/srv_ico.ico"
IDR_APP_ICON    ICON                    "img/srv_ico.ico"

1 VERSIONINFO
        FILEVERSION    NVER1,NVER2,NVER3,NVER4
        PRODUCTVERSION NVER1,NVER2,NVER3,NVER4
        FILEOS         0x00000000
        FILETYPE       0x00000001
BEGIN
        BLOCK "StringFileInfo"
        BEGIN
          BLOCK "040904e4"
          BEGIN
          VALUE "Comments",           "Супер программа для ..."
          VALUE "CompanyName",        "ОАО ""ПУПКИН"""
          VALUE "FileDescription",    "Установка контроля и т.д"
          VALUE "FileVersion",        quote(NVER)
          VALUE "InternalName",       "РТК-07 ПРО"
          VALUE "LegalCopyright",     "ОАО ""ПУПКИН"""
          VALUE "LegalTrademarks",    "РТК-07 ПРО ""ТАЙФУН"""
          VALUE "OriginalFilename",   quote(TARGET) ".exe"
          VALUE "ProductName",        "Установка контроля и т.д"
          VALUE "ProductVersion",     quote(NVER)
          VALUE "PrivateBuild",       "Ревизия SVN " quote(SVN_REV)
          VALUE "SpecialBuild",       "Программный комплекс РТК-07 ПРО ""ТАЙФУН"" Программа опроса АЦП и датчиков пристутствия"
          VALUE "Builder",            "Lesav"
          END
        END
        BLOCK "VarFileInfo"
        BEGIN
            VALUE "Translation",        0x0419, 0x04E3
        END
END

Затем сгенерить файл rtk_version.pri
Файл rtk_version.pri
Код:
DEFINES     += SVN_REV=356
DEFINES     += NVER1=0
DEFINES     += NVER2=1
DEFINES     += NVER3=0
DEFINES     += NVER4=112
DEFINES     += TARGET=$$TARGET

И в каждый файл .pro после обявления TARGET добавить строчки
Код:
TARGET = rzs

include( $$_PRO_FILE_PWD_/../rtk_version.pri )

CONFIG(debug, debug|release):{
  TARGET = $$sprintf('%1_d', $$TARGET)
}else:{
  TARGET = $$sprintf('%1_r', $$TARGET)
}

win32 {
  RC_FILE     += rc_info.rc
  OTHER_FILES += rc_info.rc
}


Результат см в картинке (http://www.prog.org.ru/index.php?action=dlattach;topic=19099.0;attach=3955)


Название: Re: Qt MinGW: Добавление информации в бинарный файл (иконка, версия и т.д.)
Отправлено: Пантер от Август 10, 2011, 11:09
А для CMake?


Название: Re: Qt MinGW: Добавление информации в бинарный файл (иконка, версия и т.д.)
Отправлено: LisandreL от Август 10, 2011, 12:19
А что есть IDR_APP_ICON? В смысле понятно из названия, что иконка приложения, но чем она отличается от IDI_ICON1? Где какая используется?
Можно просто ткнуть, где почитать.  ;)


Название: Re: Qt MinGW: Добавление информации в бинарный файл (иконка, версия и т.д.)
Отправлено: lesav от Август 10, 2011, 14:05
А для CMake?
Я c CMake не работал.

А что есть IDR_APP_ICON? ... где почитать?

Сам бы с удовольствием почитал. Долго искал в ин-те информацию по структуре файла .rc  Информации такой не нашел.

Может ResEd (http://radasm.cherrytree.at/resed/) Вам поможет ?



Название: Re: Qt MinGW: Добавление информации в бинарный файл (иконка, версия и т.д.)
Отправлено: kambala от Август 10, 2011, 14:46
мне вот этот гайд (http://www.zachburlingame.com/2011/02/versioning-a-native-cc-binary-with-visual-studio/) помог, но там IDR_APP_ICON не упоминается


Название: Re: Qt MinGW: Добавление информации в бинарный файл (иконка, версия и т.д.)
Отправлено: lesav от Август 10, 2011, 15:22
мне вот этот гайд (http://www.zachburlingame.com/2011/02/versioning-a-native-cc-binary-with-visual-studio/) помог

Гдеж Вы раньше были!  :D
Я на эту конструкцию пол дня убил
Код
C
#define STRINGIZE2(s) #s
#define STRINGIZE(s) STRINGIZE2(s)

но там IDR_APP_ICON не упоминается

А я стартовал из другой точки (http://forum.vingrad.ru/index.php?showtopic=227059&view=findpost&p=1633938), там IDR_APP_ICON упоминается. И я решил его оставить.

В MSDN (http://msdn.microsoft.com/en-us/library/aa381043.aspx) описания IDR_APP_ICON нет.


Название: Re: Qt MinGW: Добавление информации в бинарный файл (иконка, версия и т.д.)
Отправлено: lesav от Август 10, 2011, 15:53
Разобрался.

001     ICON    DISCARDABLE     "img/srv_ico1.ico"
002     ICON    DISCARDABLE     "img/srv_ico2.ico"
003     ICON    DISCARDABLE     "img/srv_ico3.ico"

Первое поле добавляет идентификатор ресурса, по которому этот ресурс можно заюзать из программы

Примерно также реализована %SystemRoot%\system32\SHELL32.dll  (в ней 237 иконок)

Если Вы используете несколько иконок в .rc файле, появиться возможность сменить картинку в ярлыке программы.

А вот результат расследования! ))))

IDR_APP_ICON  всплыло из проекта http://trac.emma-soft.com/halite.
там стояло в Halite.rc (http://trac.emma-soft.com/halite/changeset/97/res)
#define IDR_APP_ICON                    128

Автор топика на ВинГраде (http://forum.vingrad.ru/index.php?showtopic=227059&view=findpost&p=1633938) просто забыл убрать это объявление