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 user profile iconTino: 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 > 0then
  begin
    GetMem(vi,vis);
    try
      GetFileVersionInfo(pchar(Filename),0,vis,vi);
      if(vi = nilthen exit;

      // get language code
      VerQueryValue(vi,'\\VarFileInfo\\Translation',translation,vis);
      if(translation = nilthen exit;

      VerQueryValue(vi,
        pchar(Format('\\StringFileInfo\\%.4x%.4x\\%s',
          [LOWORD(longint(translation^)),HIWORD(longint(translation^)),
          BlockKey])),ip,vis);
      if(ip = nilthen 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.


Tino - Di 08.02.05 10:11

Du kannst dir ja auch mal diesen FAQ Beitrag anschauen: ...Informationen über eine Datei ermitteln? [http://www.delphi-forum.de/topic_Informationen+ueber+eine+Datei+ermitteln_15946.html]

Gruß
Tino


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 > 0then
  begin
    GetMem(vi,vis);
    try
      GetFileVersionInfo(pchar(Filename),0,vis,vi);
      if(vi = nilthen exit;

      // get language code
      VerQueryValue(vi,'\\VarFileInfo\\Translation',translation,vis);
      if(translation = nilthen exit;

      VerQueryValue(vi,
        pchar(Format('\\StringFileInfo\\%.4x%.4x\\%s',
          [LOWORD(longint(translation^)),HIWORD(longint(translation^)),
          BlockKey])),ip,vis);
      if(ip = nilthen 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

user profile iconTimonWorld hat folgendes geschrieben Zum zitierten Posting springen:
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?