Как определить версию используемой DLL программно?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как определить версию используемой DLL программно?

Сообщение jsa » 11.01.2024 09:11:01

Здравствуйте.
За годы на компе бардачок накопился.
dblib.dll для компоненты TMSSQLConnection лежат 3х версий 0.95, 1.0, 1.3
Что-то в папках по проектам, что-то в IDE что-то в системных папках ОС Windows
Отсюда вопрос возник, какой именно файл dll использует программа, если явно его нигде не указывать.
Можно ли программно определить какой файл подцепляется при запуске, и его версию?
jsa
постоялец
 
Сообщения: 282
Зарегистрирован: 28.11.2017 13:46:04

Re: Как определить версию используемой DLL программно?

Сообщение Alexx2000 » 11.01.2024 09:52:19

Код: Выделить всё
program project1;

{$mode objfpc}{$H+}

uses
  Classes, SysUtils, Windows, FileInfo;

var
  h: TLibHandle;
  ModuleName: UnicodeString;
begin
  h:= LoadLibrary('uxtheme.dll');
  {
    либо
    h:= GetModuleHandle('uxtheme.dll');
    если библиотека уже загружена.
  }

  if (h <> NilHandle) then
  begin
    SetLength(ModuleName, MAX_PATH + 1);
    SetLength(ModuleName, GetModuleFileNameW(h, PWideChar(ModuleName), MAX_PATH));
    WriteLn(ModuleName);

    with TVersionInfo.Create do
    begin
      Load(h);

      WriteLn(Format('%d.%d.%.d', [FixedInfo.FileVersion[0],
                                       FixedInfo.FileVersion[1],
                                       FixedInfo.FileVersion[2]]));

      Free;
    end;
  end;

  ReadLn;
end.
Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 488
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи

Re: Как определить версию используемой DLL программно?

Сообщение jsa » 11.01.2024 10:13:47

Спасибо.
Это ответ на второй вопрос, про определение версии известного файла.
А как определить какой именно (по какому пути) файл используется?
jsa
постоялец
 
Сообщения: 282
Зарегистрирован: 28.11.2017 13:46:04

Re: Как определить версию используемой DLL программно?

Сообщение Alexx2000 » 11.01.2024 10:30:01

Это ответ на оба вопроса, вот часть кода которая выводит путь
Код: Выделить всё
    SetLength(ModuleName, MAX_PATH + 1);
    SetLength(ModuleName, GetModuleFileNameW(h, PWideChar(ModuleName), MAX_PATH));
    WriteLn(ModuleName);
Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 488
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи

Re: Как определить версию используемой DLL программно?

Сообщение Снег Север » 11.01.2024 11:59:48

Windows всегда использует в первую очередь ту длл, которая лежит в одной папке с экзешником, потом ту, что указана в переменной окружения PATH, потом ту, что найдет в системных папках. Исключений не бывает, это не линух.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3039
Зарегистрирован: 27.11.2007 16:14:47

Re: Как определить версию используемой DLL программно?

Сообщение xchgeaxeax » 11.01.2024 14:45:01

Снег Север писал(а):потом ту, что найдет в системных папках

Там искать не будет, если они не перечислены в PATH - это не linux, где нету столько разбросанного по разным папкам бинарного мусора.
xchgeaxeax
постоялец
 
Сообщения: 125
Зарегистрирован: 11.05.2023 03:51:40

Re: Как определить версию используемой DLL программно?

Сообщение Vapaamies » 11.01.2024 14:58:01

Из командной строки — есть команда where (оказалось даже, что она встроена в cmd.exe, отдельного файла where.exe я не нашел). Для более глубокого погружения — Process Explorer Русиновича, он не только DLL покажет.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Как определить версию используемой DLL программно?

Сообщение Снег Север » 11.01.2024 16:28:54

xchgeaxeax писал(а):Там искать не будет, если они не перечислены в PATH

Бред. Бинарный мусор где попало - это фишка линухов, причем у всех мусор лежит по-разному.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3039
Зарегистрирован: 27.11.2007 16:14:47

Re: Как определить версию используемой DLL программно?

Сообщение Alexx2000 » 11.01.2024 16:39:14

Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 488
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи

Re: Как определить версию используемой DLL программно?

Сообщение Alex2013 » 11.01.2024 18:14:00

Насколько я помню dll могут каким то образом регистрироваться в системе ( скорее всего в реестре)
Зы
https://remontka.pro/dll-register-windows/
https://lumpics.ru/how-register-dll-library-in-system/
Alex2013
долгожитель
 
Сообщения: 3049
Зарегистрирован: 03.04.2013 11:59:44

Re: Как определить версию используемой DLL программно?

Сообщение xchgeaxeax » 11.01.2024 18:28:38

Специально ради проверки поставил на VirtualBox чистую Windows. Как и ожидалось в ней куча допотопных костылей. На чистой Windows в PATH перечислены %SystemRoot% и %SystemRoot%system32, хотя судя по алгоритму поиска это избыточно для библиотек (т.е. поиск по этим каталогам будет выполняться дважды). Но подозреваю, что научить cmd.exe этим же фокусам они так и не догадались, поэтому в PATH до сих пор болтаются эти каталоги.

Добавлено спустя 2 минуты 3 секунды:
Alex2013 писал(а):Насколько я помню dll могут каким то образом регистрироваться в системе ( скорее всего в реестре)

По предыдущей ссылке как раз показан пункт 5 - Known DLLs. Это как раз и подразумевает поиск в списке "установленных в систему". Попытка сделать каталог /lib и /lib64 из linux.
xchgeaxeax
постоялец
 
Сообщения: 125
Зарегистрирован: 11.05.2023 03:51:40

Re: Как определить версию используемой DLL программно?

Сообщение jsa » 12.01.2024 10:38:44

Всем спасибо.
jsa
постоялец
 
Сообщения: 282
Зарегистрирован: 28.11.2017 13:46:04

Re: Как определить версию используемой DLL программно?

Сообщение Vapaamies » 12.01.2024 21:29:10

xchgeaxeax писал(а):по алгоритму поиска это избыточно для библиотек (т.е. поиск по этим каталогам будет выполняться дважды).

А посмотреть?
Код: Выделить всё
echo "%SystemRoot%"  "%SystemRoot%\system32"
"C:\Windows"  "C:\Windows\system32"
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Как определить версию используемой DLL программно?

Сообщение xchgeaxeax » 12.01.2024 21:45:28

Vapaamies писал(а):А посмотреть?

Код: Выделить всё
program Project1;

uses
  Windows, SysUtils;

var
  S: UnicodeString;

begin
  SetLength(S, MAX_PATH + 1);
  SetLength(S, GetWindowsDirectoryW(PWideChar(S), MAX_PATH));
  WriteLn('GetWindowsDirectoryW = "', S, '"'); // GetWindowsDirectoryW
  WriteLn('echo %SystemRoot%    = "', GetEnvironmentVariable('SystemRoot'), '"'); // %SystemRoot%
  WriteLn;
  SetLength(S, MAX_PATH + 1);
  SetLength(S, GetSystemDirectoryW(PWideChar(S), MAX_PATH));
  WriteLn('GetSystemDirectoryW        = "', S, '"');
  WriteLn('echo %SystemRoot%\system32 = "', GetEnvironmentVariable('SystemRoot'), '\system32"'); // %SystemRoot%\system32
  WriteLn;
  ReadLn;
end.
Посмотрел:
Screenshot_20240112_203949.png
У вас нет необходимых прав для просмотра вложений в этом сообщении.
xchgeaxeax
постоялец
 
Сообщения: 125
Зарегистрирован: 11.05.2023 03:51:40

Re: Как определить версию используемой DLL программно?

Сообщение Vapaamies » 13.01.2024 16:47:23

xchgeaxeax писал(а):
Код: Выделить всё
  WriteLn('GetWindowsDirectoryW = "', S, '"'); // GetWindowsDirectoryW
[...]
  WriteLn('GetSystemDirectoryW        = "', S, '"');
end.

И?
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16

Рейтинг@Mail.ru