Определение версии системных DLL
Falk0ner, вс, 06/07/2008 - 15:34.
Определение версии системных DLL
{ **** UBPFD *********** by kladovka.net.ru ****
>>
Функция предназначена для определение версии системных DLL. Кодирование версии осуществляется вспомогательной функцией MakeVersion (см. код).
Зависимости: Windows
Автор: Almaz, <a href="mailto:az_spb@mail.ru">az_spb@mail.ru</a>, Санкт-Петербург
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;
>>
Функция предназначена для определение версии системных DLL. Кодирование версии осуществляется вспомогательной функцией MakeVersion (см. код).
Зависимости: Windows
Автор: Almaz, <a href="mailto:az_spb@mail.ru">az_spb@mail.ru</a>, Санкт-Петербург
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;
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;
Отправить комментарий