Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.117.183.206] |
|
Сообщ.
#1
,
|
|
|
Полно примеров о том как извлечь сведения о версии исполняемого файла, но большинство из них сводится только к получению информации о самой версии. В этом примере работа идет с Unicode функциями, при желании можно переделать под Ansi вариант, кому как удобнее.
type PStringFileInfoW = ^TStringFileInfoW; TStringFileInfoW = packed record pszCompanyName : WideString; pszFileDescription : WideString; pszFileVersion : WideString; pszInternalName : WideString; pszLegalCopyright : WideString; pszLegalTrademarks : WideString; pszOriginalFilename: WideString; pszProductName : WideString; pszProductVersion : WideString; pszComments : WideString; pszPrivateBuild : WideString; pszSpecialBuild : WideString; pszLanguageName : WideString; pszLanguageID : WideString; end; procedure GetFileInfoW(pszPath: WideString; var sfi: TStringFileInfoW); const AQueryValue: Array [1..14] of WideString = ( 'CompanyName', 'FileDescription', 'FileVersion', 'InternalName', 'LegalCopyright', 'LegalTrademarks', 'OriginalFileName', 'ProductName', 'ProductVersion', 'Comments', 'PrivateBuild', 'SpecialBuild', 'LanguageName', 'LanguageID' ); type TChrSet = Array [0..1] of Word; PChrset = ^TChrSet; var pcValue : PChrSet; iAppSize: DWORD; pcBuf : Pointer; puLen : DWORD; pszLng : WideString; function GetFileInfoProcW(pszValue: WideString): WideString; var pszBlock: WideString; pInfo : Pointer; begin pszBlock := FormatW('\StringFileInfo\%s\%s', [pszLng, pszValue]); if VerQueryValueW(pcBuf, @pszBlock[1], pInfo, puLen) then Result := PWideChar(pInfo) else Result := ''; end; begin iAppSize := GetFileVersionInfoSizeW(@pszPath[1], iAppSize); if (iAppSize > 0) then try pcBuf := HeapAlloc(GetProcessHeap, HEAP_ZERO_MEMORY, iAppSize); GetFileVersionInfoW(@pszPath[1], 0, iAppSize, pcBuf); VerQueryValueW(pcBuf, '\VarFileInfo\Translation', Pointer(pcValue), puLen); if (puLen > 0) then try pszLng := FormatW('%.4x%.4x', [pcValue[0], pcValue[1]]); sfi.pszCompanyName := GetFileInfoProcW(AQueryValue[1]); sfi.pszFileDescription := GetFileInfoProcW(AQueryValue[2]); sfi.pszFileVersion := GetFileInfoProcW(AQueryValue[3]); sfi.pszInternalName := GetFileInfoProcW(AQueryValue[4]); sfi.pszLegalCopyright := GetFileInfoProcW(AQueryValue[5]); sfi.pszLegalTrademarks := GetFileInfoProcW(AQueryValue[6]); sfi.pszOriginalFilename := GetFileInfoProcW(AQueryValue[7]); sfi.pszProductName := GetFileInfoProcW(AQueryValue[8]); sfi.pszProductVersion := GetFileInfoProcW(AQueryValue[9]); sfi.pszComments := GetFileInfoProcW(AQueryValue[10]); sfi.pszPrivateBuild := GetFileInfoProcW(AQueryValue[11]); sfi.pszSpecialBuild := GetFileInfoProcW(AQueryValue[12]); sfi.pszLanguageName := GetFileInfoProcW(AQueryValue[13]); sfi.pszLanguageID := GetFileInfoProcW(AQueryValue[14]); finally end; finally HeapFree(GetProcessHeap, 0, pcBuf); end; end; Пример использования: /// var ExeInfo: TStringFileInfoW; /// ZeroMemory(@ExeInfo, SizeOf(TStringFileInfoW)); GetFileInfoW(AnsiStringToWide(ParamStr(0), CP_ACP), ExeInfo); /// MessageBoxW(0, MAKEINTRESOURCEW(ExeInfo.pszProductName), nil, MB_OK); |