Получить версию DLL
Примечание: DLL не обязательно экспортируют DllGetVersion, поэтому сначала проверьте это, прежде чем использовать это.
// DLLVERSIONINFO structure type PDLLVerInfo=^TDLLVersionInfo; TDLLVersionInfo=Record cbSize, // Размер структуры в байтах dwMajorVersion, // Major version of the DLL dwMinorVersion, // Minor version of the DLL dwBuildNumber, // Build number of the DLL dwPlatformID: DWord; // Платформа DLL end; var DllGetVersion: function( dvi: PDLLVerInfo): PDLLVerInfo; stdcall; function GetDllVersion(DllName: string; var DLLVersionInfo: TDLLVersionInfo): Boolean; var hInstDll: THandle; p: pDLLVerInfo; begin Result := False; // Получить дескриптор модуля DLL hInstDll := LoadLibrary(PChar(DllName)); if (hInstDll = 0) then Exit; // Возвращает адрес экспортируемой функции (DLL) @DllGetVersion := GetProcAddress(hInstDll, 'DllGetVersion'); // Если дескриптор неверный, очистить и выйти if (@DllGetVersion) = nil then begin FreeLibrary(hInstDll); Exit; end; new(p); try ZeroMemory(p, SizeOf(p^)); p^.cbSize := SizeOf(p^); // Вызвать функцию DllGetVersion DllGetVersion(p); DLLVersionInfo.dwMajorVersion := p^.dwMajorVersion; DLLVersionInfo.dwMinorVersion := p^.dwMinorVersion; @DllGetVersion := nil; Result := True; finally dispose(P); end; // Освободить DLL FreeLibrary(hInstDll); end;
Пример получения версии comctl32.dll
procedure TForm1.Button1Click(Sender: TObject); var DLLVersionInfo: TDLLVersionInfo; begin if not GetDllVersion('comctl32.dll',DLLVersionInfo) then begin DLLVersionInfo.dwMajorVersion := 4; DLLVersionInfo.dwMinorVersion := 0; end; with DLLVersionInfo do ShowMessage(Format('ComCtl Version: %d.%d / Build: %d', [dwMajorVersion, dwMinorVersion, dwBuildNumber])) end;
Комментарии