--- dao/DelphiScanner/Utils.pas 2015/09/03 14:24:23 2692 +++ dao/DelphiScanner/Utils.pas 2015/09/03 14:27:21 2693 @@ -22,6 +22,8 @@ class function AdobeReaderExists(): Boolean; + class function Sto_GetFmtFileVersion(const FileName: String = ''): String; + @@ -177,4 +179,61 @@ AReg.Free; end; + +/// +/// This function reads the file resource of "FileName" and returns +/// the version number as formatted text. +/// +/// Sto_GetFmtFileVersion() = '4.13.128.0' +/// Sto_GetFmtFileVersion('', '%.2d-%.2d-%.2d') = '04-13-128' +/// +/// If "Fmt" is invalid, the function may raise an +/// EConvertError exception. +/// Full path to exe or dll. If an empty +/// string is passed, the function uses the filename of the +/// running exe or dll. +/// Format string, you can use at most four integer +/// values. +/// Formatted version number of file, '' if no version +/// resource found. +class function TUtils.Sto_GetFmtFileVersion(const FileName: String = ''): String; +var + sFileName: String; + iBufferSize: DWORD; + iDummy: DWORD; + pBuffer: Pointer; + pFileInfo: Pointer; + iVer: array[1..4] of Integer; +begin + // set default value + Result := ''; + // get filename of exe/dll if no filename is specified + sFileName := Trim(FileName); + if (sFileName = '') then + sFileName := GetModuleName(HInstance); + // get size of version info (0 if no version info exists) + iBufferSize := GetFileVersionInfoSize(PChar(sFileName), iDummy); + if (iBufferSize > 0) then + begin + GetMem(pBuffer, iBufferSize); + try + // get fixed file info (language independent) + GetFileVersionInfo(PChar(sFileName), 0, iBufferSize, pBuffer); + VerQueryValue(pBuffer, '\', pFileInfo, iDummy); + // read version blocks + iVer[1] := HiWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionMS); + iVer[2] := LoWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionMS); + iVer[3] := HiWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionLS); + iVer[4] := LoWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionLS); + finally + FreeMem(pBuffer); + end; + + // format result string + Result := Format('%d.%d.%d.%d', [iVer[1], iVer[2], iVer[3], iVer[4]]); + + end; +end; + + end.