function GetVersion(sFile: string; bIncludeBuild: boolean): string; var dwfvw, dwZero, dwvsf: DWORD; Major, Minor, Release, Build: DWord; pfvw: PChar; pvsf: PVSFixedFileInfo; s: string; begin Result := ''; // attempt to read version info size dwfvw := GetFileVersionInfoSize(PChar(sFile), dwZero); // exit on error if dwfvw <> 0 then begin GetMem(pfvw, dwfvw); try // exit if unable to retrieve version info if (GetFileVersionInfo(PChar(sFile), dwZero, dwfvw, pfvw)) then begin // get the build value if (VerQueryValue(pfvw, '\', Pointer(pvsf), dwvsf)) then begin if ((pvsf^.dwFileFlags and VS_FF_PRERELEASE) > 0) then begin s := 'beta; ' end else begin s := ''; end; // For clarity store in temporary variables Major := HIWORD(pvsf^.dwFileVersionMS); Minor := LOWORD(pvsf^.dwFileVersionMS); Release := HIWORD(pvsf^.dwFileVersionLS); Build := LOWORD(pvsf^.dwFileVersionLS); // Always show full Build Numbers from now GN.. 2/9/03 Result := Format('Version %d.%d.%d Build %d', [Major, Minor, Release, Build]); if bIncludeBuild then begin if Release > 0 then begin Result := Format('Version %d.%d.%d Build %d', [Major, Minor, Release, Build]) end else begin Result := Format('Version %d.%d Build %d', [Major, Minor, Build]) end; end else begin if Release > 0 then begin Result := Format('Version %d.%d.%d', [Major, Minor, Release]) end else begin Result := Format('Version %d.%d', [Major, Minor]) end; end; end; end; finally FreeMem(pfvw); end; end; end;
|