Как установить информацию о версии для существующего.exe, .dll?

В рамках нашего процесса сборки мне нужно установить информацию о версии для всех наших скомпилированных двоичных файлов. Некоторые из двоичных файлов уже имеют информацию о версии (добавленной во время компиляции), а некоторые - нет.

Я хочу иметь возможность применять следующую информацию:

  • название компании
  • Уведомление об авторских правах
  • наименование товара
  • Описание товара
  • Версия файла
  • Версия продукта

Все эти атрибуты указываются сценарием сборки и должны применяться после компиляции. Это стандартные двоичные файлы (не сборки), скомпилированные с помощью C++ Builder 2007.

Как я могу это сделать?

16 ответов

Хотя это не пакетный процесс, Visual Studio также может добавлять / редактировать файловые ресурсы.

Просто используйте File->Open->File на.EXE или.DLL. Это удобно для исправления информации о версии после сборки или добавления ее в файлы, у которых нет этих ресурсов для начала.

В отличие от многих других ответов, это решение использует полностью бесплатное программное обеспечение.

Во-первых, создайте файл с именем Resources.rc как это:

VS_VERSION_INFO VERSIONINFO
    FILEVERSION    1,0,0,0
    PRODUCTVERSION 1,0,0,0
{
    BLOCK "StringFileInfo"
    {
        BLOCK "040904b0"
        {
            VALUE "CompanyName",        "ACME Inc.\0"
            VALUE "FileDescription",    "MyProg\0"
            VALUE "FileVersion",        "1.0.0.0\0"
            VALUE "LegalCopyright",     "© 2013 ACME Inc. All Rights Reserved\0"
            VALUE "OriginalFilename",   "MyProg.exe\0"
            VALUE "ProductName",        "My Program\0"
            VALUE "ProductVersion",     "1.0.0.0\0"
        }
    }
    BLOCK "VarFileInfo"
    {
        VALUE "Translation", 0x409, 1200
    }
}

Затем используйте GoRC, чтобы скомпилировать его в .res использование файла:

GoRC /fo Resources.res Resources.rc

(см. мой комментарий ниже для зеркала GoRC.exe )

Затем используйте Resource Hacker в режиме CLI, чтобы добавить его в существующий .exe:

ResHacker -add MyProg.exe, MyProg.exe, Resources.res,,,

Это оно!

Или вы можете проверить бесплатное StampVer для Win32 exe/dll файлов.
Это только изменит версии файла и продукта, если у них уже есть ресурс версии. Он не может добавить ресурс версии, если он не существует.

rcedit относительно новый и хорошо работает из командной строки: https://github.com/atom/rcedit

$ rcedit "path-to-exe-or-dll" --set-version-string "Comments" "This is an exe"
$ rcedit "path-to-exe-or-dll" --set-file-version "10.7"
$ rcedit "path-to-exe-or-dll" --set-product-version "10.7"

Есть также модуль NPM, который оборачивает его из JavaScript, и задача Grunt на случай, если вы используете Grunt.

Хакер ресурсов

Я скачал последнюю версию (5.1.7) с [AngusJ]: Resource Hacker. Всю необходимую информацию можно найти на этой странице (параметры командной строки, сценарии, ...). В следующем пошаговом руководстве я оперирую двумя исполняемыми файлами(лабораторными крысами), которые (по понятным причинам) я скопировал в мойcwd:

  • ResourceHacker.exe: я подумал, что было бы интересно работать над собой
  • cmake.exe: случайный исполняемый файл без установленной информации о версии (часть установкиv3.6.3 на мою машину)

Прежде чем идти дальше, я хочу упомянуть, чтоResourceHacker имеет забавный вывод с терминала, и следующие фрагменты копирования / вставки могут вызвать некоторую путаницу.

1. Настройка

Это больше похоже на предварительный шаг, чтобы познакомиться с окружающей средой, показать, что здесь нет ничего интересного...

e:\Work\Dev\Stackru\q000284258>dir
 Volume in drive E is Work
 Volume Serial Number is 3655-6FED

 Directory of e:\Work\Dev\Stackru\q000284258

2019-01-28  20:09    <DIR>          .
2019-01-28  20:09    <DIR>          ..
2016-11-03  09:17         5,413,376 cmake.exe
2019-01-03  02:06         5,479,424 ResourceHacker.exe
2019-01-28  20:30               496 ResourceHacker.ini
               3 File(s)     10,893,296 bytes
               2 Dir(s)  103,723,261,952 bytes free

e:\Work\Dev\Stackru\q000284258>set PATH=%PATH%;c:\Install\x64\CMake\CMake\3.6.3\bin

e:\Work\Dev\Stackru\q000284258>.\cmake --help >nul 2>&1

e:\Work\Dev\Stackru\q000284258>echo %errorlevel%
0

e:\Work\Dev\Stackru\q000284258>.\ResourceHacker.exe -help

e:\Work\Dev\Stackru\q000284258>

==================================
Resource Hacker Command Line Help:
==================================

-help             : displays these abbreviated help instructions.
-help commandline : displays help for single commandline instructions
-help script      : displays help for script file instructions.




e:\Work\Dev\Stackru\q000284258>echo %errorlevel%
0

Как видно, исполняемые файлы в порядке, они работают нормально, и вот как выглядят ихдетали(которые нас интересуют):

2. Ресурсы

Файлы ресурсов - это текстовые файлы, которые содержат ресурсы. Ресурс (упрощенный) имеет:

  • название
  • Тип
  • Значение

Для более подробной информации проверьте [MS.Docs]: О файлах ресурсов. Существует много инструментов (упомянутых в существующих ответах), которые облегчают редактирование файлов ресурсов, таких как:

  • VStudio создает по умолчанию при запуске нового проекта
  • Можно создать такой файл вручную
  • Но, поскольку речь идет оResource Hacker, и:

    • Он может извлекать ресурсы из существующего исполняемого файла
    • В него встроены ресурсы (как показано на предыдущем рисунке)

    Я собираюсь использовать это для этого шага (-action extract)

Затем, чтобы ресурс был встроен в.exe(.dll,...), он должен бытьскомпилирован в двоичную форму, которая соответствует форматуPE. Опять же, есть много инструментов, которые могут достичь этого, но, как вы, наверное, догадались, я собираюсь придерживатьсяResource Hacker(-action compile).

e:\Work\Dev\Stackru\q000284258>:: Extract the resources into a file
e:\Work\Dev\Stackru\q000284258>.\ResourceHacker.exe -open .\ResourceHacker.exe -save .\sample.rc -action extract -mask VersionInfo,, -log con

e:\Work\Dev\Stackru\q000284258>

[28 Jan 2019, 20:58:03]

Current Directory:
e:\Work\Dev\Stackru\q000284258

Commandline:
.\ResourceHacker.exe  -open .\ResourceHacker.exe -save .\sample.rc -action extract -mask VersionInfo,, -log con

Open    : e:\Work\Dev\Stackru\q000284258\ResourceHacker.exe
Save    : e:\Work\Dev\Stackru\q000284258\sample.rc


Success!

e:\Work\Dev\Stackru\q000284258>:: Modify the resource file and set our own values
e:\Work\Dev\Stackru\q000284258>
e:\Work\Dev\Stackru\q000284258>:: Compile the resource file
e:\Work\Dev\Stackru\q000284258>.\ResourceHacker.exe -open .\sample.rc -save .\sample.res -action compile -log con

e:\Work\Dev\Stackru\q000284258>

[28 Jan 2019, 20:59:51]

Current Directory:
e:\Work\Dev\Stackru\q000284258

Commandline:
.\ResourceHacker.exe  -open .\sample.rc -save .\sample.res -action compile -log con

Open    : e:\Work\Dev\Stackru\q000284258\sample.rc
Save    : e:\Work\Dev\Stackru\q000284258\sample.res

Compiling: e:\Work\Dev\Stackru\q000284258\sample.rc
Success!

e:\Work\Dev\Stackru\q000284258>dir /b
cmake.exe
ResourceHacker.exe
ResourceHacker.ini
sample.rc
sample.res

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

sample.rc:

1 VERSIONINFO
FILEVERSION 3,1,4,1592
PRODUCTVERSION 2,7,1,8
FILEOS 0x4
FILETYPE 0x1
{
BLOCK "StringFileInfo"
{
    BLOCK "040904E4"
    {
        VALUE "CompanyName", "Cristi Fati\0"
        VALUE "FileDescription", "20190128 - SO q000284258 demo\0"
        VALUE "FileVersion", "3.1.4.1592\0"
        VALUE "ProductName", "Colonel Panic\0"
        VALUE "InternalName", "100\0"
        VALUE "LegalCopyright", "(c) Cristi Fati 1999-2999\0"
        VALUE "OriginalFilename", "ResHack\0"
        VALUE "ProductVersion", "2.7.1.8\0"
    }
}

BLOCK "VarFileInfo"
{
    VALUE "Translation", 0x0409 0x04E4  
}
}

3. Вставить

Это также будет выполненоResource Hacker(-action addoverwrite). Поскольку файлы.exe уже скопированы, я собираюсь редактировать их ресурсы на месте.

e:\Work\Dev\Stackru\q000284258>.\ResourceHacker.exe -open .\cmake.exe -save .\cmake.exe -res .\sample.res -action addoverwrite -mask VersionInfo,, -log con

e:\Work\Dev\Stackru\q000284258>

[28 Jan 2019, 21:17:19]

Current Directory:
e:\Work\Dev\Stackru\q000284258

Commandline:
.\ResourceHacker.exe  -open .\cmake.exe -save .\cmake.exe -res .\sample.res -action addoverwrite -mask VersionInfo,, -log con

Open    : e:\Work\Dev\Stackru\q000284258\cmake.exe
Save    : e:\Work\Dev\Stackru\q000284258\cmake.exe
Resource: e:\Work\Dev\Stackru\q000284258\sample.res

  Added: VERSIONINFO,1,1033

Success!

e:\Work\Dev\Stackru\q000284258>copy ResourceHacker.exe ResourceHackerTemp.exe
        1 file(s) copied.

e:\Work\Dev\Stackru\q000284258>.\ResourceHackerTemp.exe -open .\ResourceHacker.exe -save .\ResourceHacker.exe -res .\sample.res -action addoverwrite -mask VersionInfo,, -log con

e:\Work\Dev\Stackru\q000284258>

[28 Jan 2019, 21:19:29]

Current Directory:
e:\Work\Dev\Stackru\q000284258

Commandline:
.\ResourceHackerTemp.exe  -open .\ResourceHacker.exe -save .\ResourceHacker.exe -res .\sample.res -action addoverwrite -mask VersionInfo,, -log con

Open    : e:\Work\Dev\Stackru\q000284258\ResourceHacker.exe
Save    : e:\Work\Dev\Stackru\q000284258\ResourceHacker.exe
Resource: e:\Work\Dev\Stackru\q000284258\sample.res

  Modified: VERSIONINFO,1,1033

Success!

e:\Work\Dev\Stackru\q000284258>del /f /q ResourceHackerTemp.*

e:\Work\Dev\Stackru\q000284258>dir
 Volume in drive E is Work
 Volume Serial Number is 3655-6FED

 Directory of e:\Work\Dev\Stackru\q000284258

2019-01-28  21:20    <DIR>          .
2019-01-28  21:20    <DIR>          ..
2016-11-03  09:17         5,414,400 cmake.exe
2019-01-03  02:06         5,479,424 ResourceHacker.exe
2019-01-28  21:17               551 ResourceHacker.ini
2019-01-28  20:05             1,156 sample.rc
2019-01-28  20:59               792 sample.res
               5 File(s)     10,896,323 bytes
               2 Dir(s)  103,723,253,760 bytes free

Как видно, мне пришлось сделать небольшой трюк (gainarie), так как я не могу (по крайней мере, не думаю, что смогу) изменить.exe во время использования.

4. Тест

Это необязательный этап, чтобы убедиться, что:

  • Исполняемые файлы все еще работают (они не были испорчены в процессе)
  • Ресурсы были добавлены / обновлены
e:\Work\Dev\Stackru\q000284258>.\cmake --help >nul 2>&1

e:\Work\Dev\Stackru\q000284258>echo %errorlevel%
0

e:\Work\Dev\Stackru\q000284258>.\ResourceHacker.exe -help

e:\Work\Dev\Stackru\q000284258>

==================================
Resource Hacker Command Line Help:
==================================

-help             : displays these abbreviated help instructions.
-help commandline : displays help for single commandline instructions
-help script      : displays help for script file instructions.




e:\Work\Dev\Stackru\q000284258>echo %errorlevel%
0

И ихдетали:

Как насчет этого?

verpatch /va foodll.dll %VERSION% %FILEDESCR% %COMPINFO% %PRODINFO% %BUILDINFO%

Доступно здесь с полными источниками.

Я делаю это без дополнительного инструмента. Я только что добавил следующие файлы в свой проект приложения Win32.

Один заголовочный файл, который определяет некоторые константы, которые мы не можем использовать в нашем файле ресурсов и даже в программном коде. Нам нужно только поддерживать один файл. Благодаря команде Qt, которая показала мне, как это сделать в проекте Qt, теперь она также работает в моем приложении Win32.

---- [version.h] ----

#ifndef VERSION_H
#define VERSION_H

#define VER_FILEVERSION             0,3,0,0
#define VER_FILEVERSION_STR         "0.3.0.0\0"

#define VER_PRODUCTVERSION          0,3,0,0
#define VER_PRODUCTVERSION_STR      "0.3.0.0\0"

#define VER_COMPANYNAME_STR         "IPanera"
#define VER_FILEDESCRIPTION_STR     "Localiza archivos duplicados"
#define VER_INTERNALNAME_STR        "MyProject"
#define VER_LEGALCOPYRIGHT_STR      "Copyright 2016 ipanera@gmail.com"
#define VER_LEGALTRADEMARKS1_STR    "All Rights Reserved"
#define VER_LEGALTRADEMARKS2_STR    VER_LEGALTRADEMARKS1_STR
#define VER_ORIGINALFILENAME_STR    "MyProject.exe"
#define VER_PRODUCTNAME_STR         "My project"

#define VER_COMPANYDOMAIN_STR       "www.myurl.com"

#endif // VERSION_H

---- [MyProjectVersion.rc] ----

#include <windows.h>
#include "version.h"

VS_VERSION_INFO VERSIONINFO
FILEVERSION     VER_FILEVERSION
PRODUCTVERSION  VER_PRODUCTVERSION
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904E4"
        BEGIN
            VALUE "CompanyName",        VER_COMPANYNAME_STR
            VALUE "FileDescription",    VER_FILEDESCRIPTION_STR
            VALUE "FileVersion",        VER_FILEVERSION_STR
            VALUE "InternalName",       VER_INTERNALNAME_STR
            VALUE "LegalCopyright",     VER_LEGALCOPYRIGHT_STR
            VALUE "LegalTrademarks1",   VER_LEGALTRADEMARKS1_STR
            VALUE "LegalTrademarks2",   VER_LEGALTRADEMARKS2_STR
            VALUE "OriginalFilename",   VER_ORIGINALFILENAME_STR
            VALUE "ProductName",        VER_PRODUCTNAME_STR
            VALUE "ProductVersion",     VER_PRODUCTVERSION_STR
        END
    END

    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1252
    END
END

Есть этот инструмент ChangeVersion [1]

Список возможностей (с сайта):

  • Интерфейс командной строки
  • поддержка файлов.EXE, .DLL и.RES
  • обновить FileVersion и ProductVersion на основе маски версии
  • добавить / изменить / удалить строки ключей версии
  • настроить флаги файлов (отладочные, специальные, приватные и т. д.)
  • обновить файлы проекта ( .bdsproj | .bpr | .bpk | .dproj)
  • добавить / изменить основной значок приложения
  • использовать INI-файл с конфигурацией
  • Поддержка Windows Vista (требуется повышение)
  • легко интегрировать в среду непрерывной сборки

Полное раскрытие: я знаю парня, который написал этот инструмент, я раньше работал с ним. Но это также означает, что я знаю, что он делает качественное программное обеспечение;)


[1] ссылка не работает. Кажется, есть зеркальная версия на download.cnet.com.

verpatch хорош, но не обрабатывает символы юникода...
попробуй ResourceLib

Приведенный выше ответ от @DannyBeckett мне очень помог,

Я помещаю следующее в пакетный файл и помещаю его в ту же папку, где находится ResourceHacker.exe и EXE, над которым я работаю, и он отлично работает. [вы можете отредактировать его под свои нужды]

    @echo off
    :start1
    set /p newVersion=Enter version number [?.?.?.?]:
    if "%newVersion%" == "" goto start1
    :start2
    set /p file=Enter EXE name [for 'program.exe' enter 'program']:
    if "%file%" == "" goto start2
    for /f "tokens=1-4 delims=." %%a in ('echo %newVersion%') do (set ResVersion=%%a,%%b,%%c,%%d)
    (
    echo:VS_VERSION_INFO VERSIONINFO
    echo:    FILEVERSION    %ResVersion%
    echo:    PRODUCTVERSION %ResVersion%
    echo:{
    echo:    BLOCK "StringFileInfo"
    echo:    {
    echo:        BLOCK "040904b0"
    echo:        {
    echo:            VALUE "CompanyName",        "MyCompany\0"
    echo:            VALUE "FileDescription",    "TestFile\0"
    echo:            VALUE "FileVersion",        "%newVersion%\0"
    echo:            VALUE "LegalCopyright",     "COPYRIGHT © 2019 MyCompany\0"
    echo:            VALUE "OriginalFilename",   "%file%.exe\0"
    echo:            VALUE "ProductName",        "Test\0"
    echo:            VALUE "ProductVersion",     "%newVersion%\0"
    echo:        }
    echo:    }
    echo:    BLOCK "VarFileInfo"
    echo:    {
    echo:        VALUE "Translation", 0x409, 1200
    echo:    }
    echo:}
    ) >Resources.rc     &&      echo setting Resources.rc
    ResourceHacker.exe -open resources.rc -save resources.res -action compile -log CONSOLE
    ResourceHacker -open "%file%.exe" -save "%file%Res.exe" -action addoverwrite -resource "resources.res"  -log CONSOLE
    ResourceHacker.exe -open "%file%Res.exe" -save "%file%Ico.exe" -action addskip -res "%file%.ico" -mask ICONGROUP,MAINICON, -log CONSOLE
    xCopy /y /f "%file%Ico.exe" "%file%.exe"
    echo.
    echo.
    echo your compiled file %file%.exe is ready
    pause

[в качестве примечания я использовал ресурсный хакер для компиляции файла res, а не GoRC]

Хочу собрать более компактную версию

  • Шаг 1: создайте ресурс
  • Шаг 2: Загрузите ResourceHacker
  • Шаг 3: Скомпилируйте res в файлы rc
  • Шаг 4: Запустите сценарий: измените exe

Шаг 1: создайте resource

Подготовьте файл ресурсов: resource.rc

      VS_VERSION_INFO VERSIONINFO
    FILEVERSION    0,0,0,0
    PRODUCTVERSION 0,0,0,0
{
    BLOCK "StringFileInfo"
    {
        BLOCK "040904b0"
        {
            VALUE "CompanyName",        "\0"
            VALUE "FileDescription",    "\0"
            VALUE "FileVersion",        "0.0.0.0\0"
            VALUE "LegalCopyright",     "© 2020 Carson. All rights reserved.\0"
            VALUE "OriginalFilename",   ".exe\0"
            VALUE "ProductName",        "\0"
            VALUE "ProductVersion",     "0.0.0.0\0"
        }
    }
    BLOCK "VarFileInfo"
    {
        VALUE "Translation", 0x0409, 1200
    }
}

Шаг 2: Загрузите ResourceHacker

Есть два способа получить это.

  1. Скачать с Chocolatey :
    • установить choco
    • choco install reshack -y
    • После установки вам может потребоваться добавить переменные среды.
  2. Сайт ResourceHacker

Шаг 3: компилировать res в rc файлы

      ResourceHacker.exe -open resources.rc -save resources.res ^
 -action compile -log CONSOLE

Шаг 4: Запустите сценарий: измените exe

      SET INPUT_EXE=app.exe
SET OUTPUT_EXE=app.exe
ResourceHacker.exe -open %OUTPUT_EXE% -save %OUTPUT_EXE% ^
 -resource resources.res ^
 -action addoverwrite ^
 -mask VersionInf ^
 -log CONSOLE

Сводный сценарий

      SET INPUT_EXE=app.exe
SET OUTPUT_EXE=app.exe

ResourceHacker.exe -open resources.rc -save resources.res ^
 -action compile -log CONSOLE

ResourceHacker.exe -open %OUTPUT_EXE% -save %OUTPUT_EXE% ^
 -resource resources.res ^
 -action addoverwrite ^
 -mask VersionInf ^
 -log CONSOLE

Ссылка

Немного опоздал на вечеринку, но так как я искал его (и мне, возможно, понадобится найти его снова когда-нибудь), вот что я сделал, чтобы включить версию, название компании и т. Д. В мою C++ DLL под VS2013 Express:

  1. Создал и отредактировал файл dllproj.rc, как указано ранее.
  2. Добавлена ​​строка "rc.exe dllproj.rc" в качестве шага предварительной сборки в проекте DLL.
  3. Добавлен dllproj.res в папку ресурсов для проекта.

Надеюсь это поможет!

Существует консоль Resource Tuner от Heaventools Software.

Resource Tuner Console - это инструмент командной строки, который позволяет разработчикам автоматизировать редактирование различных типов ресурсов в большом количестве 32- и 64-разрядных исполняемых файлов Windows.

Более подробно смотрите на странице " Изменение переменных версии и обновление информации о версии".

Вы можете попробовать загрузить FVIE из Download Link и отредактировать информацию для любого файла.exe.

(ИЛИ ЖЕ)

Вы можете скачать StampVer - Win32 Version Resource Stamping по ссылке для скачивания, которая действительно полезна для файлов Windows .exe.

(ИЛИ ЖЕ)

Вы можете использовать командный инструмент под названием RCEDIT. Загрузите с Github Source ссылку и затем выполните сборку с использованием Visual Studio 2015, а затем у вас есть конкретные команды для изменения версии файлов.exe. См. Docs ссылку для различных доступных команд.

Это лучший инструмент, который я когда-либо видел для этой работы, он позволяет полностью контролировать все файловые ресурсы, включая VersionInfo.

Смотрите: ResourceEditor от SpeedFreak.

Есть много инструментов для reverse engineering такие как Interactive Disassembler где вы можете изменить много информации, чтобы увидеть больше инструментов: https://www.apriorit.com/dev-blog/366-software-reverse-engineering-tools. и попробуйте эти инструменты https://alternativeto.net/software/xn-resource-editor/

Другие вопросы по тегам