Zum Inhalt springen

Versionsnummer einer .exe auslesen


Flons

Empfohlene Beiträge

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(p),BufLen-1);

end

else begin

Result:='';

end;

end;

begin

VerInfoSize:=GetFileVersionInfoSize(PChar(AFilename),BufLen);

if VerInfoSize>0 then begin

GetMem(VerInfo,VerInfoSize);

try

if GetFileVersionInfo(PChar(AFilename),0,VerInfoSize,VerInfo) then begin

if VerQueryValue(VerInfo,'\',Pointer(VerValue),VerValueSize) 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('FileVersion');

LblBeschreibung.Caption:=GetStringValue('FileDescription');

LblCopyright.Caption:=GetStringValue('LegalCopyright');

with StringGrid1 do begin

ColWidths[0]:=100;

ColWidths[1]:=300;

for i:=0 to 4 do begin

Cells[0,i]:=cCaptions;

Cells[1,i]:=GetStringValue(cIdents);

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... :confused:

Danke.

Gruß

Florian

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Flons,

für einen Delphi-DAU hast Du aber ganz schön was kompliziertes geschrieben.

Irgendwie bezweifle ich aber dass dieser Code deiner ist. ;)

Na gut komme ich zur Sache. Hier

findest Du eine ähnliche aber etwas einfachere Lösung für dein Problem . Da muss man der Funktion 'VersionInformation' eine Listbox übergeben. Die Items der Listbox , die mann dann anschliessend auslesen und verwenden kann, enthalten dann alle Informationen der laufenden EXE. Soll es eine andere EXE sein dann muss man die Variable 'S' entsprechend anpassen:

also statt S := Application.ExeName;

dann S:= 'c:\meinPfad\meinProgramm.exe';

Hoffentlich hift Dir das weiter.

Gruß

Dimi

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...