Получить версию файла для Delphi XE2 и более поздних версий

Я обновляю программу до Delphi XE7 из Delphi 2010. Код, показанный ниже, перестал работать, я думаю, из-за необходимости адаптироваться к Unicode и использовать GetFileVersionInfoW вместо GetFileVersionInfoSize.

Кто-нибудь разработал более современную версию функции, которую я использовал, показанную ниже? Я пока не могу найти никаких примеров в сети, и боюсь, что программирование под Windows на низком уровне мне не по силам.

Спасибо за любую помощь!

Старый код ниже больше не работает на Delphi XE2 и более поздних версиях: просто возвращает 1.0.0.0

procedure GetBuildInfo(var V1, V2, V3, V4: Word);
{From Steve Schafer }
var
  VerInfoSize: DWORD;
  VerInfo: pointer;
  VerValueSize: DWORD;
  VerValue: PVSFixedFileInfo;
  Dummy: DWORD;

begin
  VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy);
  GetMem(VerInfo, VerInfoSize);
  GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
  VerQueryValue(VerInfo, '\', pointer(VerValue), VerValueSize);
  with VerValue^ do
    begin
      V1 := dwFileVersionMS shr 16;
      V2 := dwFileVersionMS and $FFFF;
      V3 := dwFileVersionLS shr 16;
      V4 := dwFileVersionLS and $FFFF;
    end;
  FreeMem(VerInfo, VerInfoSize);
end;

person CHEAPS    schedule 04.12.2014    source источник
comment
Вы уверены, что ваше приложение. не версии 1.0.0.0? Кстати. вам обязательно нужно добавить проверку ошибок.   -  person TLama    schedule 05.12.2014
comment
Опубликованный вами код отлично работает в новом приложении VCL в XE6. Поместите метку в форму, перейдите к параметрам проекта и установите информацию о версии для сборки, добавьте обработчик для FormShow с этими двумя строками (и соответствующими объявлениями переменных): GetBuildInfo (Major, Minor, Rev, Build); Label1.Caption: = Format ('% d.% D.% D.% D', [Major, Minor, Rev, Build]); Проект- ›Сборка (чтобы добавить информацию о версии и запустить приложение. В моем случае я установил версию 4.3.2.1, и на этикетке отображается 4.3.2.1.   -  person Ken White    schedule 05.12.2014
comment
Код работает одинаково во всех версиях Delphi. Отсутствие проверки ошибок не идеально.   -  person David Heffernan    schedule 05.12.2014
comment
RTL сопоставляет функции Win32 API с типом данных, используемым для (P)Char. Таким образом, GetFileVersionInfoSize() и GetFileVersionInfo() фактически сопоставляются с GetFileVersionInfoSizeA() и GetFileVersionInfoA() в Delphi 2007 и ранее и сопоставляются с GetFileVersionInfoSizeW() и GetFileVersionInfoW() в Delphi 2009 и позже. Поэтому этот код работает во всех версиях Delphi без каких-либо изменений.   -  person Remy Lebeau    schedule 05.12.2014
comment
Спасибо - я не уверен, что произошло, но он всегда возвращал 1.0.0.0, хотя у меня были установлены разные версии файлов. Однако я заметил, что версия продукта и несколько других полей отсутствовали, и как только я ввел их обратно в IDE, функция снова заработала. Так что спасибо, что подтвердили и указали мне правильное направление.   -  person CHEAPS    schedule 05.12.2014
comment
Лично при получении собственного номера версии вызывающего приложения я предпочитаю загружать ресурс версии напрямую, а не использовать GetFileVersionInfo(): stackoverflow.com/a/ 13942403/65863   -  person Remy Lebeau    schedule 05.12.2014
comment
@Cheaps, вы, вероятно, не учитываете, что разные конфигурации сборки имеют свой собственный ресурс версии. Когда вы меняете один, вы должны изменить их все. Среда IDE не очень хорошо справляется с управлением ресурсами версий с несколькими сборками, но есть инструменты и надстройки, которые упрощают работу.   -  person Remy Lebeau    schedule 05.12.2014


Ответы (1)


Ваш код отлично работает при компиляции всеми версиями Delphi. Следовательно, единственный логический вывод относительно того, почему код сообщает о версии 1.0.0.0, заключается в том, что это версия 1.0.0.0.

Другими словами, глядя на этот код, вы не обнаружите свою проблему. Ваша проблема будет обнаружена, если вы выясните, почему вам не удается установить информацию о версии, которую вы намереваетесь при компиляции.

Вероятно, также стоит отметить, что ваш код не пытается проверять возвращаемые значения на наличие ошибок.

person David Heffernan    schedule 05.12.2014