Как проверить Windows VC ++ DLL в системах Unix

2

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

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

Теги:
deployment
visual-c++
versioning

4 ответа

1
Лучший ответ

Информация о версии для изначально скомпилированного кода в 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)
  • 0
    Ох, я рада, что у меня не было времени, чтобы заняться какой-либо другой работой в первую очередь! Спасибо за простое решение.
1

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

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

  • 1
    Я искал вариант вина, к сожалению, это невозможно. Расшифровка информации, к сожалению, является тем орехом, который, я думаю, мне нужно взломать.
1

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

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

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

0

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

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

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

  • 0
    Мой msbuild foo низок (это на VS2008, где файлы vcproj на самом деле не являются проектами msbuild), поэтому проблема заключается в том, как расширить $Id: $ до хеша коммитов во время сборки.
  • 0
    Мой Git-fu низкий, но в VS2008 есть команда предварительной сборки, которая позволит вам запустить исполняемый файл, который расширит идентификаторы до хэша коммита. Второй вопрос - спросить, как в первую очередь создаются ресурсы VERSIONINFO.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню