[b]
unit[/b] FileVer;
[b]interface[/b]
[b]function[/b] GetFileVersionsString([b]const[/b] p_sFilepath : [b]string[/b]) : [b]string[/b];
[b]implementation[/b]
[b]uses[/b]
Windows;
[color=#000080][i]//
// "frmt" (Copyright, Assarbad)
//[/i][/color]
[b]function[/b] frmt(mformat: [b]string[/b]; args: [b]array[/b] [b]of[/b] POINTER): [b]string[/b];
[b]var[/b]
buf: [b]array[/b][0..$3ff][b]of[/b] char;
[b]begin[/b]
ZeroMemory(@buf[0], sizeof(buf));
wvsprintf(@buf[0], @mformat[1], pchar(@args));
SetString(result, pchar(@buf[0]), lstrlen(@buf[0]));
[b]end[/b];
[b]const[/b] [color=#000080][i]// Das Ergebnis soll ja nett formatiert sein :)[/i][/color]
sFixVerFormat = 'Fileversion: %d.%d.%d.%d / Productversion: %d.%d.%d.%d';
[b]function[/b] GetFileVersionsString([b]const[/b] p_sFilepath : [b]string[/b]) : [b]string[/b];
[b]var[/b]
dwVersionSize : DWord; [color=#000080][i]// Buffer für die Grösse der Versionsinfo der abgefragten Datei[/i][/color]
dwDummy : DWord; [color=#000080][i]// Dummy, Wert wird nicht benötigt[/i][/color]
pVerBuf : Pointer; [color=#000080][i]// Buffer für die Versionsdaten[/i][/color]
pFixBuf : PVSFixedFileInfo; [color=#000080][i]// Buffer für die Versionsinfo fester Länge[/i][/color]
sReqdInfo : [b]string[/b]; [color=#000080][i]// Hier kommt rein, welcher Teil der Versionsinfo abgefragt werden soll[/i][/color]
[b]begin[/b]
[color=#000080][i]// Annahme: Die Datei hat keine Versionsinfo[/i][/color]
Result := frmt(sFixVerFormat,
[POINTER(0),POINTER(0),POINTER(0),POINTER(0),
POINTER(0),POINTER(0),POINTER(0),POINTER(0)]);
dwDummy := 0; [color=#000080][i]// Dummy initialisieren[/i][/color]
sReqdInfo := '\'; [color=#000080][i]// Es soll die Versionsinfo fester Länge abgefragt werden
// Mal sehen, wieviel Platz die Versionsinfo der Datei braucht[/i][/color]
dwVersionSize := GetFileVersionInfoSize(PChar(p_sFilepath),dwDummy);
[b]if[/b] dwVersionSize > 0 [b]then[/b] [color=#000080][i]// Wenn > 0, dann Versionsinfo vorhanden[/i][/color]
[b]try[/b]
GetMem(pVerBuf,dwVersionSize); fillchar(pVerBuf^,dwVersionSize,0);
[color=#000080][i]// Gesamte Versionsinformationen auslesen[/i][/color]
[b]if[/b] GetFileVersionInfo(PChar(p_sFilepath),0,dwVersionSize,pVerBuf) [b]then[/b]
[b]begin[/b] [color=#000080][i]// Werte für Versionsinfo fester Länge extrahieren[/i][/color]
[b]if[/b] VerQueryValue(pVerBuf,PChar(sReqdInfo),Pointer(pFixBuf),dwDummy) [b]then[/b]
[b]begin[/b]
[color=#000080][i]// und als Ergebnis ausgeben[/i][/color]
Result := frmt(sFixVerFormat,
[POINTER((pFixBuf^.dwFileVersionMS [b]and[/b] $FFFF0000) [b]shr[/b] 16),
POINTER(pFixBuf^.dwFileVersionMS [b]and[/b] $0000FFFF),
POINTER((pFixBuf^.dwFileVersionLS [b]and[/b] $FFFF0000) [b]shr[/b] 16),
POINTER(pFixBuf^.dwFileVersionLS [b]and[/b] $0000FFFF),
POINTER((pFixBuf^.dwProductVersionMS [b]and[/b] $FFFF0000) [b]shr[/b] 16),
POINTER(pFixBuf^.dwProductVersionMS [b]and[/b] $0000FFFF),
POINTER((pFixBuf^.dwProductVersionLS [b]and[/b] $FFFF0000) [b]shr[/b] 16),
POINTER(pFixBuf^.dwProductVersionLS [b]and[/b] $0000FFFF)]);
[b]end[/b];
[b]end[/b];
[b]finally[/b] [color=#000080][i]// Resourcen wieder freigeben[/i][/color]
FreeMem(pVerBuf,dwVersionSize);
[b]end[/b];
[b]end[/b];
[b]end[/b].