Hallo!
Ich hoffe, Ihr könnt mir helfen:
Ich möchte mittels Delphi die Versionsnummer einer .exe auslesen. Die .exe hat einen festen Pfad. Das Ergebnis, also die Versionsnummer, soll dann in ein label geschrieben werden.
Nun habe ich schon rausgefunden, das es mit der Funktion GetVersionInfo funzt bzw. funzen soll.
Hier mein Quellcode:
procedure TForm1.GetVersionInfo(const AFilename:String);
const
cCaptions : array[0…5] of String =
(‚Firmenname‘,‚Interner Name‘,‚Original-Dateiname‘,‚Produktname‘,
‚Produktversion‘,‚Sprache‘);
cIdents : array[0…4] of String =
(‚CompanyName‘,‚InternalName‘,‚OriginalFilename‘,’ ProductName’,‚ProductVersion‘);
type
PLanguageCharSet = ^TLanguageCharSet;
TLanguageCharSet = packed record L,C : Word end;
var
V1, V2, V3, V4 : Word;
VerInfoSize : Integer;
VerValueSize : DWord;
VerInfo : Pointer;
VerValue : PVSFixedFileInfo;
BufLen : DWord;
LanguageCharSet : PLanguageCharSet;
s : String;
i : Integer;
function GetStringValue(const AIdent:String):String;
var
BufLen : DWord;
p : Pointer;
begin
if VerQueryValue(VerInfo,
PChar(Format(’\StringFileInfo%.4x%.4x%s’,
[LanguageCharSet^.L,LanguageCharSet^.C,AIdent])),
p,BufLen) and (BufLen>0) then begin
SetString(Result,PChar§,BufLen-1);
end
else begin
Result:=’’;
end;
end;
begin
VerInfoSize:=GetFileVersionInfoSize(PChar(AFilenam e),BufLen);
if VerInfoSize>0 then begin
GetMem(VerInfo,VerInfoSize);
try
if GetFileVersionInfo(PChar(AFilename),0,VerInfoSize, VerInfo) then begin
if VerQueryValue(VerInfo,’’,Pointer(VerValue),VerVal ueSize) then
with VerValue^ do begin
V1:=dwFileVersionMS shr 16;
V2:=dwFileVersionMS and $FFFF;
V3:=dwFileVersionLS shr 16;
V4:=dwFileVersionLS and $FFFF;
// Hier muß man sich entscheiden, entweder numerisch oder unten als String
// Gleiches gilt für Produktversion
LblDateiVersionN.Caption:=Format(’%d.%d.%d.%d’,[V1,V2,V3,V4]);
// Hier können noch andere Standard-Werte abgefragt werden:
// dwProductVersionMS, dwProductVersionLS : Produktversion
// dwFileFlagsMask, dwFileFlags : Flags, wie z.B. Testversion
// dwFileOS : Angaben zum Betriebssystem
// dwFileType, dwFileSubtype : Angaben zum Dateityp, z.B. Maustreiber
// dwFileDateMS, dwFileDateLS : Datum der Erzeugung
end;
// Sprach und Zeichensatz-ID ermitteln
if VerQueryValue(VerInfo,
‚\VarFileInfo\Translation‘,
Pointer(LanguageCharSet),BufLen) then begin
// Stringfelder auslesen
LblDateiVersion.Caption:=GetStringValue(‚FileVersi on‘);
LblBeschreibung.Caption:=GetStringValue(‚FileDescr iption‘);
LblCopyright.Caption:=GetStringValue(‚LegalCopyrig ht‘);
with StringGrid1 do begin
ColWidths[0]:=100;
ColWidths[1]:=300;
for i:=0 to 4 do begin
Cells[0,i]:=cCaptions[i];
Cells[1,i]:=GetStringValue(cIdents[i]);
end;
// Sprache auslesen
SetLength(s,100);
BufLen:=VerLanguageName(LanguageCharSet.L,PChar(s) ,100);
if BufLen>0 then begin
SetLength(s,StrLen(PChar(s)));
Cells[0,5]:=cCaptions[5];
Cells[1,5]:=s;
end;
end;
end;
end;
finally
FreeMem(VerInfo,VerInfoSize);
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
GetVersionInfo(Application.Exename);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
with OpenDialog1 do begin
if Execute then GetVersionInfo(Filename);
end;
end;
Leider raffe ich noch nicht ganz, wie und wo ich den Dateipfad angebe und wie ich die versionsnummer dann in das Label bekomme.
Könntet Ihr mir helfen? Ich bin in Delphi leider noch sehr nah am DAU…
Danke.
Gruß
Florian