Почему GetFileVersionInfo возвращает неверную версию SqlOledb.dll и пути решения
Проблема, с которой столкнулись разработчики, заключается в том, что функция GetFileVersionInfo возвращает некорректную информацию о версии файла SqlOledb.dll. В реальности версия файла составляет 10.0.18362.1, но при использовании GetFileVersionInfo получается версия 6.2.18362.1. Это поведение наблюдается в 32-битных приложениях, написанных на Delphi 5 и Delphi XE6.
Возможные причины и решения:
AppCompat Shim: Возможно, вступает в игру AppCompat Shim, который вводит в заблуждение относительно версии номера, чтобы приложение работало как под Windows 6.2, так и под Windows 10.0.
SupportedOS: Вероятно, необходимо обновить записи SupportedOS в манифесте сборки, чтобы указать поддержку Windows 10.
Прямой доступ к ресурсу: Можно напрямую обращаться к ресурсу VS_VERSIONINFO_HEADER (как RT_VERSION, MAKEINTRESOURCE(1)), чтобы получить реальную информацию VS_FIXEDFILEINFO, которая не будет зависеть от манифеста.
Подтвержденное решение:
Как было отмечено в комментариях, добавление в манифест сборки записи для поддержки Windows 10:
позволяет GetFileVersionInfo корректно возвращать версию файла SqlOledb.dll.
Пример кода на Object Pascal (Delphi):
program FixFileVersionInfo;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
function GetCorrectFileVersion(Filename: WideString): string;
var
value: Pointer;
lengthOfReturned: Cardinal;
fileInfo: PVSFixedFileInfo;
iMajor, iMinor, iBuild, iRelease: Integer;
begin
Result := '?.?.?.?';
// Прямой доступ к ресурсу версии файла
value := nil;
lengthOfReturned := 0;
if not VerQueryValueW(Pointer(NativeInt(Filename) + SizeOf(WideString)), '\', {var}value, {var}lengthOfReturned) then
Exit;
fileInfo := PVSFixedFileInfo(value);
iMajor := fileInfo.dwFileVersionMS shr 16;
iMinor := fileInfo.dwFileVersionMS and $FFFF;
iRelease := fileInfo.dwFileVersionLS shr 16;
iBuild := fileInfo.dwFileVersionLS and $FFFF;
Result := Format('%d.%d.%d.%d', [iMajor, iMinor, iRelease, iBuild]);
end;
procedure Main;
var
filename: string;
version: string;
begin
filename := 'C:\Program Files (x86)\Common Files\System\Ole DB\sqloledb.dll';
version := GetCorrectFileVersion(filename);
WriteLn('Файл: ' + filename);
WriteLn('Версия файла: ' + version);
// Не забудьте добавить запись supportedOS в Assembly.manifest
end;
begin
Main;
WriteLn('Нажмите Enter, чтобы закрыть...');
ReadLn;
end.
Заключение:
Проблема с некорректным возвратом версии файла SqlOledb.dll функциями GetFileVersionInfo и связанными с ней может быть решена путем обновления манифеста сборки для поддержки Windows 10 или путем прямого обращения к ресурсу версии файла, что позволит избежать влияния AppCompat Shim.
Проблема связана с некорректным определением версии файла `SqlOledb.dll` функцией `GetFileVersionInfo` в 32-битных приложениях на Delphi, возможно из-за механизма совместимости AppCompat Shim, и решение заключается в обновлении манифеста сборки для подде
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.