Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Почему `GetFileVersionInfo` возвращает неверную версию `SqlOledb.dll` и пути решения

Delphi , Базы данных , SQL

Почему GetFileVersionInfo возвращает неверную версию SqlOledb.dll и пути решения

Проблема, с которой столкнулись разработчики, заключается в том, что функция GetFileVersionInfo возвращает некорректную информацию о версии файла SqlOledb.dll. В реальности версия файла составляет 10.0.18362.1, но при использовании GetFileVersionInfo получается версия 6.2.18362.1. Это поведение наблюдается в 32-битных приложениях, написанных на Delphi 5 и Delphi XE6.

Возможные причины и решения:

  1. AppCompat Shim: Возможно, вступает в игру AppCompat Shim, который вводит в заблуждение относительно версии номера, чтобы приложение работало как под Windows 6.2, так и под Windows 10.0.

  2. SupportedOS: Вероятно, необходимо обновить записи SupportedOS в манифесте сборки, чтобы указать поддержку Windows 10.

  3. Прямой доступ к ресурсу: Можно напрямую обращаться к ресурсу VS_VERSIONINFO_HEADER (как RT_VERSION, MAKEINTRESOURCE(1)), чтобы получить реальную информацию VS_FIXEDFILEINFO, которая не будет зависеть от манифеста.

Подтвержденное решение:

Как было отмечено в комментариях, добавление в манифест сборки записи для поддержки Windows 10:

<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>

позволяет 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: SQL ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 13:38:43/0.00514817237854/1