Как проверить Windows VC ++ DLL в системах Unix - PullRequest
2 голосов
/ 28 мая 2010

У меня есть решение, в основном C #, но с несколькими проектами VC ++, которое проталкивается через наш стандартный процесс выпуска (скрипты perl и bash в Unix-системах). В настоящее время инициатива заключается в проверке версий DLL и EXE по мере их прохождения. Все версии установлены таким образом, что версия файла имеет формат $Id: $ (между двоеточием и вторым долларом должен быть хеш-код git commit), а версия продукта имеет формат $Hudson Build: $ (между двоеточием и вторым доллар должен быть строкой, представляющей детали сборки hudson).

В настоящее время эта система работает очень хорошо для проектов C #, потому что эта информация о версии хранится в виде простых строк в скомпилированном коде (вы можете буквально использовать команду unix strings и просматривать информацию о версии); проблема в том, что проекты VC ++ не предоставляют эту информацию в виде строк (я использовал систему Windows для проверки правильности установки информации о версии), поэтому я не уверен, как извлечь версию в системе Unix. Любые предложения для A) Получение строкового представления версии, встроенной в скомпилированный код, или B) Утилита / скрипт, который может извлечь эту информацию?

Ответы [ 4 ]

1 голос
/ 07 июня 2010

Информация о версии для нативно скомпилированного кода в 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)
1 голос
/ 28 мая 2010

Исполняемые файлы Windows и общие библиотеки (DLL) кодируют информацию о версии в виде двоичных данных ( VERSIONINFO ) в разделе resources .

Посмотрите на этот вопрос, чтобы увидеть API-интерфейсы win32, которые можно использовать для запроса информации о версии. Хотя вам нужно внести небольшое изменение в этот код. API FindResource и LoadResource должны быть переданы в дескрипторе в EXE / DLL (уже загружена в память), чья информация о версии вам нужна. Передача NULL получает информацию о версии, связанной с EXE, из которой вызывается этот код (это не то, что вам нужно).

Вам необходимо вызвать LoadLibrary , чтобы загрузить файл EXE или DLL на диск и получить его дескриптор, а затем передать этот дескриптор вышеупомянутым функциям API в качестве параметра hModule. А также может быть распечатать необходимую информацию на консоли после того, как вы получили требуемый VERSIONINFO.

1 голос
/ 28 мая 2010

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

Другой вариант - выяснить, как MSVC ++ кодирует эту информацию, чтобы вы могли ее декодировать или запрашивать с помощью стандартных инструментов Unix.

0 голосов
/ 02 июня 2010

Любая причина, по которой вы не можете просто использовать строку, содержащую $Id: $, например:

const char version[] = "$Id: $"

Конечно, у вас есть идентификаторы версий в двух местах, но они получены из одного и того же источника.

...