Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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