Entwickler-Ecke
Windows API - Versionsinfo auslesen
simplex3 - Fr 04.02.05 20:22
Titel: Versionsinfo auslesen
Moin.
Kann ich irgendwie die Informationen, die ich unter Projekt|Optionen|Versionsinfo eingegeben habe [speziell: Dateiversion und Produktversion] aus dem Programm selbst heraus auslesen?
Wahrscheinlich mal wieder gaaaanz einfach...
Schon mal prophylaktisch :oops:
Moderiert von
Tino: Topic aus Sonstiges verschoben am Di 08.02.2005 um 09:10
UGrohne - Fr 04.02.05 20:25
Ja, diese Funktion hab ich irgendwo mal gefunden, weiß aber nimmer woher:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| function getversion(datei: String):string; type thilo=record case integer of 0: (all:dword); 1: (lo:word;hi:word); end; var buffer:pointer; dummy:cardinal; size:cardinal; p:pointer; data:^vs_FIXEDFILEINFO; hilo:thilo; begin result:=''; size:=getfileversioninfosize(pchar(datei),dummy); getmem(buffer,size); if not getfileversioninfo(pchar(application.exename),0,size,buffer) then begin result := 'Nix eingetragen'; exit; end; p:=nil; if not verqueryvalue(buffer,pchar(''),p,size) then begin result := 'Nix eingetragen'; exit; end; data:=p; hilo.all:=data^.dwFileVersionms; result:=inttostr(hilo.hi); result:=result+'.'+inttostr(hilo.lo); hilo.all:=data^.dwFileVersionls; result:=result+'.'+inttostr(hilo.hi); result:=result+'.'+inttostr(hilo.lo); freemem(buffer); end; |
simplex3 - Fr 04.02.05 20:31
Fein. Teste ich gleich mal...
simplex3 - Fr 04.02.05 20:39
Das geht schon mal hervorragend.
Mal sehen, ob ich auch noch dahinter komme wie man die Produktinfo auslesen kann. :)
Danke!
Delete - Fr 04.02.05 22:38
Was verstehst du unter Produktinfos? Ach so, vermutlich die Sachen wie Copyright, Firma, usw. Dann versuch´s mal damit:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| function GetFileInfo(const FileName, BlockKey: string): string; var vis, dummy : dword; vi, translation, ip : pointer; begin Result := ''; vis := GetFileVersionInfoSize(pchar(FileName),dummy); if(vis > 0) then begin GetMem(vi,vis); try GetFileVersionInfo(pchar(Filename),0,vis,vi); if(vi = nil) then exit;
VerQueryValue(vi,'\\VarFileInfo\\Translation',translation,vis); if(translation = nil) then exit;
VerQueryValue(vi, pchar(Format('\\StringFileInfo\\%.4x%.4x\\%s', [LOWORD(longint(translation^)),HIWORD(longint(translation^)), BlockKey])),ip,vis); if(ip = nil) then exit;
SetString(Result,pchar(ip),vis - 1); finally FreeMem(vi); end; end; end; |
Aufzurufen mit dem Dateinamen und dem Namen des "Blocks", den du auslesen willst
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| CompanyName FileDescription FileVersion InternalName LegalCopyright OriginalFilename ProductName ProductVersion |
Die Funktion stammt im Grundcode von sakura. Ich habe sie nur für meine Zwecke bearbeitet.
simplex3 - Mo 07.02.05 13:14
Vielen Dank!
Hat geholfen.
TimonWorld - Do 03.03.05 19:55
MathiasSimmack hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| function GetFileInfo(const FileName, BlockKey: string): string; var vis, dummy : dword; vi, translation, ip : pointer; begin Result := ''; vis := GetFileVersionInfoSize(pchar(FileName),dummy); if(vis > 0) then begin GetMem(vi,vis); try GetFileVersionInfo(pchar(Filename),0,vis,vi); if(vi = nil) then exit;
VerQueryValue(vi,'\\VarFileInfo\\Translation',translation,vis); if(translation = nil) then exit;
VerQueryValue(vi, pchar(Format('\\StringFileInfo\\%.4x%.4x\\%s', [LOWORD(longint(translation^)),HIWORD(longint(translation^)), BlockKey])),ip,vis); if(ip = nil) then exit;
SetString(Result,pchar(ip),vis - 1); finally FreeMem(vi); end; end; end; | |
Bei der Funktion ist nur ein kleines Problem: Am Ende des Ausgabe-Strings werden bei mir 3 Zeichen mit dem ANSI-Wert #0 am Ende ausgegeben! Daher klappt es leider nicht, wenn ich mehrere Strings hintereinander setzen will.
Ich glaub aber das liegt an der PCharZuString-Konvertierung. Kann man aber die drei #0's nicht vermeiden?
Gruß,
Timon.
Jakane - Mo 19.09.11 11:50
Genau was ich gesucht habe, und funktioniert prima :D danke
Delete - Mo 19.09.11 15:21
TimonWorld hat folgendes geschrieben : |
Kann man aber die drei #0's nicht vermeiden? |
Trim
Gausi - Mo 19.09.11 15:25
@Luckie: Ich glaube, weitere Antworten auf die Frage (abgesehen von "Danke, klappt prima"), sind nach 6 Jahren nicht mehr unbedingt nötig. ;-)
Jakane - Fr 30.09.11 11:39
Eigendlich war da noch eine Frage mit drin :lol:
Aufzurufen mit dem Dateinamen und dem Namen des "Blocks", den du auslesen willst
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| CompanyName FileDescription FileVersion InternalName LegalCopyright OriginalFilename ProductName ProductVersion |
Unter den Versionsinfos kann man auch Komentare einstellen, gibt es auch einen BlockKey um das auszulesen?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!