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

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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

Во-первых, создайте файл с именем 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,,,

Что это!

Ответ 3

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

Ответ 4

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.

Ответ 6

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

Список функций (с веб-сайта):

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

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


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

Ответ 7

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

Ответ 8

Я делаю это без дополнительного инструмента. Я только что добавил в свой проект приложения 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 [email protected]"
#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

Ответ 9

Существует Консоль Resource Tuner из программного обеспечения Heaventools.

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

Подробнее см. Изменение версий версий и обновление информации о версии.

Ответ 10

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

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

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

Ответ 11

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

Смотрите: ResourceEditor Андерс Меландер.

Ответ 12

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

(ИЛИ ЖЕ)

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

(ИЛИ ЖЕ)

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

Ответ 13

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

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

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

1. Настройка

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

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

 Directory of e:\Work\Dev\StackOverflow\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\StackOverflow\q000284258>set PATH=%PATH%;c:\Install\x64\CMake\CMake\3.6.3\bin

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

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

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

e:\Work\Dev\StackOverflow\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\StackOverflow\q000284258>echo %errorlevel%
0

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

Img0-Initial

2. Ресурсы

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

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

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

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

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

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

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

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

e:\Work\Dev\StackOverflow\q000284258>

[28 Jan 2019, 20:58:03]

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

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

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


Success!

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

e:\Work\Dev\StackOverflow\q000284258>

[28 Jan 2019, 20:59:51]

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

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

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

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

e:\Work\Dev\StackOverflow\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). Поскольку .exes уже скопированы, я собираюсь редактировать их ресурсы на месте.

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

e:\Work\Dev\StackOverflow\q000284258>

[28 Jan 2019, 21:17:19]

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

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

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

  Added: VERSIONINFO,1,1033

Success!

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

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

e:\Work\Dev\StackOverflow\q000284258>

[28 Jan 2019, 21:19:29]

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

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

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

  Modified: VERSIONINFO,1,1033

Success!

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

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

 Directory of e:\Work\Dev\StackOverflow\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\StackOverflow\q000284258>.\cmake --help >nul 2>&1

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

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

e:\Work\Dev\StackOverflow\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\StackOverflow\q000284258>echo %errorlevel%
0

И их детали:

Img1-Final