Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

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

01.01.2007
{ **** UBPFD *********** by kladovka.net.ru ****
>> Определение версии системных DLL
 
Функция предназначена для определение версии системных 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;

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

// Закодированные 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;