Как установить информацию о версии для существующего.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
Есть два способа получить это.
- Скачать с Chocolatey :
- установить choco
-
choco install reshack -y
- После установки вам может потребоваться добавить переменные среды.
- Сайт 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
Ссылка
- ⭐resourcehacker Синтаксис командной строки открыть и выполнить поиск:
Command Line Syntax
(👆 Настоятельно рекомендую взглянуть ) - Разделите длинные команды на несколько строк с помощью командного файла Windows :
^
Немного опоздал на вечеринку, но так как я искал его (и мне, возможно, понадобится найти его снова когда-нибудь), вот что я сделал, чтобы включить версию, название компании и т. Д. В мою C++ DLL под VS2013 Express:
- Создал и отредактировал файл dllproj.rc, как указано ранее.
- Добавлена строка "rc.exe dllproj.rc" в качестве шага предварительной сборки в проекте DLL.
- Добавлен 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/