From 7c3d2500cb8b6beb3b459bdaaa174795178a37bd Mon Sep 17 00:00:00 2001 From: pasha-zzz Date: Wed, 27 Sep 2023 05:43:30 +0300 Subject: [PATCH 1/2] Read version from VS_FIXEDFILEINFO --- .../FarHintsVerInfo/FarHintsVerInfoMain.pas | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/FarHints/FarHintsVerInfo/FarHintsVerInfoMain.pas b/FarHints/FarHintsVerInfo/FarHintsVerInfoMain.pas index d6ce361..ae8810a 100644 --- a/FarHints/FarHintsVerInfo/FarHintsVerInfoMain.pas +++ b/FarHints/FarHintsVerInfo/FarHintsVerInfoMain.pas @@ -99,7 +99,7 @@ TPluginObject = class(TInterfacedObject, IHintPlugin) vCP :^LANGANDCODEPAGE; vPtr, vEnd :PWideChar; begin - { , Translation StringInfo } + { Ищем сканированием, потому что иногда Translation не совпадает с StringInfo } vPtr := vBuf; vEnd := vBuf + (vSize div SizeOf(WideChar)) - Length(cStrInfo) - 4 - 8; while vPtr < vEnd do begin @@ -111,7 +111,7 @@ TPluginObject = class(TInterfacedObject, IHintPlugin) Inc(vPtr); end; - { ( 16- ), Translation} + { Не нашли сканированием (возможно 16-ти разрядная программа), попробуем через Translation} if VerQueryValue(vBuf, '\VarFileInfo\Translation', Pointer(vCP), vLen) then vLang := FAPI.Format('%.4x%.4x', [vCP.wLanguage, vCP.wCodePage]); end; @@ -127,9 +127,35 @@ TPluginObject = class(TInterfacedObject, IHintPlugin) AItem.AddStringInfo(APrompt, vStr); end; + function VerToStr(const Ver: array of WORD): WideString; + var + S, Res: ShortString; + A: integer; + begin + for A := 0 to 3 do + begin + Str(Ver[A], S); + if A>0 then Res := Res + '.'; + Res := Res + S; + end; + Result := WideString(Res); + end; + + procedure VerAdd(const APrompt: WideString; const MS, LS: DWORD); + begin + if (MS or LS) <> 0 then + AItem.AddStringInfo(APrompt, + VerToStr([HiWord(MS), LoWord(MS), HiWord(LS), Loword(LS)])); + end; + + type + PFFI = ^TVSFixedFileInfo; + var vName :TString; vTemp :DWORD; + vFixIn: PFFI; + vFixLen: UINT; begin Result := False; vName := AItem.FullName; @@ -142,10 +168,14 @@ TPluginObject = class(TInterfacedObject, IHintPlugin) AItem.AddStringInfo(GetMsg(strName), AItem.Name); + if VerQueryValue(vBuf, '\', Pointer(vFixIn), vFixLen) then + with vFixIn^ do + VerAdd(GetMsg(strVersion), dwFileVersionMS, dwFileVersionLS); + if vLang <> '' then begin LocAdd(GetMsg(strDescription), 'FileDescription'); LocAdd(GetMsg(strCopyright), 'LegalCopyright'); - LocAdd(GetMsg(strVersion), 'FileVersion'); +// LocAdd(GetMsg(strVersion), 'FileVersion'); // LocAdd('CompanyName'); // LocAdd('OriginalFilename'); // LocAdd('InternalName'); From 06430e0047e48b574d041d655e6ac0122bcab33f Mon Sep 17 00:00:00 2001 From: pasha-zzz Date: Wed, 27 Sep 2023 09:47:59 +0300 Subject: [PATCH 2/2] Use Far API Format instead custom function --- FarHints/FarHintsVerInfo/FarHintsVerInfoMain.pas | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/FarHints/FarHintsVerInfo/FarHintsVerInfoMain.pas b/FarHints/FarHintsVerInfo/FarHintsVerInfoMain.pas index ae8810a..697dc8d 100644 --- a/FarHints/FarHintsVerInfo/FarHintsVerInfoMain.pas +++ b/FarHints/FarHintsVerInfo/FarHintsVerInfoMain.pas @@ -127,25 +127,11 @@ TPluginObject = class(TInterfacedObject, IHintPlugin) AItem.AddStringInfo(APrompt, vStr); end; - function VerToStr(const Ver: array of WORD): WideString; - var - S, Res: ShortString; - A: integer; - begin - for A := 0 to 3 do - begin - Str(Ver[A], S); - if A>0 then Res := Res + '.'; - Res := Res + S; - end; - Result := WideString(Res); - end; - procedure VerAdd(const APrompt: WideString; const MS, LS: DWORD); begin if (MS or LS) <> 0 then AItem.AddStringInfo(APrompt, - VerToStr([HiWord(MS), LoWord(MS), HiWord(LS), Loword(LS)])); + FAPI.Format('%d.%d.%d.%d', [HiWord(MS), LoWord(MS), HiWord(LS), Loword(LS)])); end; type