unit FileVer;
interface
function GetFileVersionsString(
const p_sFilepath :
string) :
string;
implementation
uses
Windows, SysUtils;
const
sFixVerFormat = '
%d.%d.%d.%d';
function GetFileVersionsString(
const p_sFilepath :
string) :
string;
var
dwVersionSize : DWord;
// Buffer für die Grösse der Versionsinfo der abgefragten Datei
dwDummy : DWord;
// Dummy, Wert wird nicht benötigt
pVerBuf : Pointer;
// Buffer für die Versionsdaten
pFixBuf : PVSFixedFileInfo;
// Buffer für die Versionsinfo fester Länge
sReqdInfo :
string;
// Hier kommt rein, welcher Teil der Versionsinfo abgefragt werden soll
begin
// Annahme: Die Datei hat keine Versionsinfo
Result := '
';
dwDummy := 0;
// Dummy initialisieren
sReqdInfo := '
\';
// Es soll die Versionsinfo fester Länge abgefragt werden
// Mal sehen, wieviel Platz die Versionsinfo der Datei braucht
dwVersionSize := GetFileVersionInfoSize(PChar(p_sFilepath),dwDummy);
if dwVersionSize > 0
then begin // Wenn > 0, dann Versionsinfo vorhanden
GetMem(pVerBuf,dwVersionSize);
try
fillchar(pVerBuf^,dwVersionSize,0);
// Gesamte Versionsinformationen auslesen
if GetFileVersionInfo(PChar(p_sFilepath),0,dwVersionSize,pVerBuf)
then
begin // Werte für Versionsinfo fester Länge extrahieren
if VerQueryValue(pVerBuf,PChar(sReqdInfo),Pointer(pFixBuf),dwDummy)
then
begin
// und als Ergebnis ausgeben
Result := Format(sFixVerFormat,
[(pFixBuf^.dwFileVersionMS
and $FFFF0000)
shr 16,
pFixBuf^.dwFileVersionMS
and $0000FFFF,
(pFixBuf^.dwFileVersionLS
and $FFFF0000)
shr 16,
pFixBuf^.dwFileVersionLS
and $0000FFFF]);
end;
end;
finally // Resourcen wieder freigeben
FreeMem(pVerBuf,dwVersionSize);
end;
end;
end;
end.