Flons Geschrieben 14. Februar 2005 Geschrieben 14. Februar 2005 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 Zitieren
dimikar Geschrieben 20. Februar 2005 Geschrieben 20. Februar 2005 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 Zitieren
Empfohlene Beiträge
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.