У меня есть решение, в основном С#, но с несколькими проектами VС++, которые вытесняются через стандартный процесс выпуска (perl и bash скрипты в Unix-блоках). В настоящее время инициатива заключается в проверке версий DLL и EXE, когда они проходят процесс. Все версии установлены так, что версия файла имеет формат $Id: $
(между двоеточием и вторым долларом должен быть хэш-код git commit), а версия продукта имеет формат $Hudson Build: $
(между двоеточием и второй доллар должен быть строкой, представляющей детали сборки hudson).
В настоящее время эта система отлично работает для проектов С#, поскольку эта информация о версии хранится как простые строки в скомпилированном коде (вы можете буквально использовать команду unix strings
и видеть информацию о версии); проблема в том, что проекты VС++ не раскрывают эту информацию в виде строк (я использовал систему Windows для проверки правильности установки информации о версии), поэтому я не уверен, как извлечь версию в системе unix. Любые предложения для A) Получение строкового представления версии, встроенной в скомпилированный код, или B) Утилита /script, которая может извлечь эту информацию?
Информация о версии для изначально скомпилированного кода в Windows хранится в UTF-16, то есть широкие строки, в двоичном формате. Вы все равно можете использовать команду strings
, но вам нужно сказать ей, чтобы искать широкие строки, прежде чем они их найдут, используя параметр -e l
.
Например, в моей системе RMB > Свойства на C:\Windows\notepad.exe дает версию файла как 5.1.2600.5512 (xpsp.080413-2105)
. Я скопировал его в ящик Linux, и, как вы говорите, strings
не находит его с флагами по умолчанию
$ strings notepad.exe | grep xpsp
$
но если вы установите кодировку, она будет прекрасной:
$ strings -e l notepad.exe | grep xpsp
5.1.2600.5512 (xpsp.080413-2105)
Предполагая, что у вас есть помощник в вашей DLL для информации, необходимой для проверки, вы можете написать небольшую программу, которая работает под wine и выводит необходимую информацию на стандартный вывод. Одна такая пробная программа доступна в разделе динамической библиотеки ссылок в Википедии.
Другой вариант - выяснить, как MSVС++ кодирует эту информацию, чтобы вы могли декодировать или запрашивать ее со стандартными инструментами unix.
исполняемые файлы Windows и общие библиотеки (DLL) кодируют информацию о версии как двоичные данные (VERSIONINFO) в resources.
Взгляните на этот вопрос, чтобы увидеть API-интерфейсы win32, которые могут использоваться для запроса информации о версии. Хотя вам нужно внести небольшое изменение в этот код. FindResource и LoadResource API должны быть переданы в обрабатывать EXE/DLL (уже загруженную в память), информацию о которой вы хотите. Передача в NULL получает информацию о версии, связанную с EXE, с которой вызывается этот код (это не то, что вы хотите).
Вам нужно позвонить LoadLibrary для загрузки EXE или DLL файла на диск и получить его дескриптор, а затем передать этот дескриптор вышеупомянутому API как параметр hModule. Кроме того, вы можете распечатать необходимую информацию для консоли после получения требуемого VERSIONINFO.
Любая причина, по которой вы не могли просто использовать строку, содержащую $Id: $
, следующим образом:
const char version[] = "$Id: $"
Конечно, у вас есть идентификаторы версий в двух местах, но они приводятся из одного источника.
$Id: $
до хеша коммитов во время сборки.