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

Определение версии системных DLL

Delphi , Файловая система , DLL и PlugIns

Code:

{ **** UBPFD *********** by kladovka.net.ru ****
>>
 
Функция предназначена для определение версии системных DLL. Кодирование версии осуществляется вспомогательной функцией MakeVersion (см. код).
 
Зависимости: Windows
Автор:       Almaz, az_spb@mail.ru, Санкт-Петербург
Copyright:   Собственное написание Almaz
Дата:        12 мая 2002 г.
********************************************** }
 
function MakeVersion(Major, Minor: Word): Integer; // Функция кодирование версии
begin
Result := MAKELONG(Minor, Major);
end;
 
function GetDllVersion(FileName: PChar): Integer;
type
TDllVersionInfo = packed record
   cbSize: DWORD;
   dwMajorVersion: DWORD;
   dwMinorVersion: DWORD;
   dwBuildNumber: DWORD;
   dwPlatformID: DWORD;
end;
PDllVersionInfo = ^TDllVersionInfo;
 
var
Lib: THandle;
DllGetVersion: function (Info: PDllVersionInfo): HRESULT; stdcall;
Info: TDllVersionInfo;
WasLoaded: Boolean;
begin
Result := 0;
try
   // Получение ссылки на DLL, если она уже загружена
   Lib := GetModuleHandle(FileName);
   if Lib = 0 then
   begin
     // Загрузка DLL, если она еще не загружена
     Lib := LoadLibrary('SHELL32.DLL');
     WasLoaded := True;
   end else WasLoaded := False;
   if Lib <> 0 then
   try
     // Получение адреса функции DllGetVersion
     DllGetVersion := GetProcAddress(Lib, 'DllGetVersion');
     if Assigned(DllGetVersion) then
     begin
       // Подготовка структуры для функции
       ZeroMemory(@Info, SizeOf(Info));
       Info.cbSize := SizeOf(Info);
       // Вызов функции DllGetVersion
       if DllGetVersion(@Info) = NOERROR then
         Result := MakeVersion(Info.dwMajorVersion, Info.dwMinorVersion);
     end;
   finally
     // Если DLL была загружена этой функцией - то выгружаем
     if WasLoaded then FreeLibrary(Lib);
   end;
except
end;
end;

Пример использования:

Code:

// Закодированные MakeVersion версии можно просто сравнивать
if GetDLLVersion('SHELL32.DLL') > MakeVersion(5, 0) then
...
 
// Вот так можно вывести версию DLL
 
var
V: Integer;
begin
V := GetDLLVersion('SHLDOC32.DLL');
ShowMessage(IntToStr(HIWORD(V)) + '.' + IntToStr(LOWORD(V)));
end;

Программа на Delphi, которая определяет версию системных DLL (Dynamic Link Libraries) на платформах Windows. Код включает в себя два основные функции: MakeVersion и GetDllVersion.

Функция MakeVersion принимает два параметра - Major и Minor, которые представляют собой номера основных и второстепенных версий DLL, и возвращает целочисленное значение, которое комбинирует эти две версии.

Функция GetDllVersion получает информацию о версии указанного файла DLL. Она использует функцию GetModuleHandle для загрузки DLL в память, если она не была уже загружена. Если DLL успешно загружена, она вызывает функцию GetProcAddress для получения адреса функции DllGetVersion внутри DLL.

Функция DllGetVersion заполняет структуру информацией о версии DLL и возвращает код ошибки. Функция GetDllVersion затем использует эту информацию для вызова функции MakeVersion, которая комбинирует номера основных и второстепенных версий в одиночное целочисленное значение.

Вот разбор кода:

function MakeVersion(Major, Minor: Word): Integer;
begin
  Result := MAKELONG(Minor, Major);
end;

function GetDllVersion(FileName: PChar): Integer;
type
  TDllVersionInfo = packed record
    cbSize: DWORD;
    dwMajorVersion: DWORD;
    dwMinorVersion: DWORD;
    dwBuildNumber: DWORD;
    dwPlatformID: DWORD;
  end;
  PDllVersionInfo = ^TDllVersionInfo;

var
  Lib: THandle;
  DllGetVersion: function(Info: PDllVersionInfo): HRESULT; stdcall;
  Info: TDllVersionInfo;
  WasLoaded: Boolean;

begin
  Result := 0;
  try
    // Get the handle of the DLL, if it's already loaded
    Lib := GetModuleHandle(FileName);
    if Lib = 0 then
    begin
      // Load the DLL, if it's not already loaded
      Lib := LoadLibrary('SHELL32.DLL');
      WasLoaded := True;
    end else WasLoaded := False;
    if Lib <> 0 then
    try
      // Get the address of the DllGetVersion function
      DllGetVersion := GetProcAddress(Lib, 'DllGetVersion');
      if Assigned(DllGetVersion) then
      begin
        // Prepare a structure for the DllGetVersion function
        ZeroMemory(@Info, SizeOf(Info));
        Info.cbSize := SizeOf(Info);
        // Call the DllGetVersion function
        if DllGetVersion(@Info) = NOERROR then
          Result := MakeVersion(Info.dwMajorVersion, Info.dwMinorVersion);
      end;
    finally
      // If the DLL was loaded by this function, unload it
      if WasLoaded then FreeLibrary(Lib);
    end;
  except
  end;
end;

// Example usage:
if GetDLLVersion('SHELL32.DLL') > MakeVersion(5, 0) then ...

В примере использования кода вы можете сравнить версию DLL с конкретной версией с помощью функции MakeVersion. Вы также можете использовать функцию GetDllVersion для получения версии DLL и отображения ее в сообщении.

Это базовая реализация проверки версии DLL и может требовать модификаций в зависимости от вашего конкретного требования.

Определение версии системных DLL - функция, предназначенная для определения версии системных DLL на языке Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: DLL и PlugIns ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-04-09 16:50:31/0.0055990219116211/1