прочитать значение FILEVERSION в коде

Моя dll, встроенная в С++, имеет файл .rc, который содержит это:

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 1,0,8,7
 PRODUCTVERSION 1,0,8,7

Я хочу прочитать значение FILEVERSION, чтобы войти в свой код... как мне это сделать? Я что-то читал, но все сообщения относятся к чтению других dll или exe, мне нужно прочитать мою текущую dll

Спасибо


person ghiboz    schedule 06.06.2018    source источник
comment
Чтение собственного ресурса версии намного проще, чем чтение ресурса другого файла. Вы не можете получить ошибку «файл не найден». GetFileVersionInfo() нужен путь, используйте GetModuleFileName(), чтобы получить его. Нужный вам HMODULE передается вам в DllMain(). Если вы используете макросы для создания файла .rc, он вам вообще не нужен. Google использует макрос для установки номера версии файла .rc для подсказок.   -  person Hans Passant    schedule 07.06.2018
comment
спасибо, но я не хочу устанавливать версию файла, а читать   -  person ghiboz    schedule 07.06.2018
comment
Да, это было очевидно. Не нужно это под любым углом - это способ сделать это без использования GetFileVersionInfo(). Код, который не написан, никогда не может дать сбой, и его не нужно поддерживать.   -  person Hans Passant    schedule 07.06.2018
comment
@ghiboz, если вы используете определения препроцессора в файле .h для указания номеров версий в файле .rc, вы также можете использовать тот же файл .h в своем коде .cpp, тогда вам не нужно динамически запрашивать номера версий во время выполнения, они уже будут доступны вашему коду во время компиляции. Я думаю, именно на это и намекал Ганс.   -  person Remy Lebeau    schedule 07.06.2018


Ответы (1)


Использование GetFileVersionInfo() и VerQueryValue() – это безопасный и официальный способ чтения данных о версии любого файла. DLL может получить свой собственный путь + имя файла, вызвав GetModuleFileName() с HINSTANCE, предоставленным ее точке входа DllMain().

При этом для DLL более эффективно просто считывать данные версии напрямую из собственного ресурса версии, используя (Find|Load|Lock)Resource() вместо GetFileVersionInfo(). Однако при этом есть предостережения:

  • это не тот подход, который официально поддерживается Microsoft.

  • указатель памяти, полученный из LockResouce() не может передать VerQueryValue(). Вы должны выделить копию блока ресурсов, а затем можете передать копию VerQueryValue().

  • однако единственными данными о версии, которые вы можете безопасно запросить из скопированного блока ресурсов с помощью VerQueryValue(), является корневая структура VS_FIXEDFILEINFO, которая достаточно хороша для получения полей FileVersion и ProductVersion. Запрос любых данных локализованной версии требует исправлений, которые обычно выполняются GetFileVersionInfo() и даже самим VerQueryValue() в координации с GetFileVersionInfo().

На StackOverflow есть несколько ответов, которые объясняют, как использовать этот подход, и некоторые из них содержат фрагменты кода, в том числе:

https://stackoverflow.com/a/48577200/65863

https://stackoverflow.com/a/13942403/65863

person Remy Lebeau    schedule 06.06.2018