Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Programmname aus .exe-Datei auslesen (https://www.delphipraxis.net/26248-programmname-aus-exe-datei-auslesen.html)

MathiasSimmack 21. Jul 2004 07:39

Re: Programmname aus .exe-Datei auslesen
 
Ich habe für ein eigenes Projekt sakuras Funktion leicht bearbeitet, damit sie mir nur das zurückliefert, was ich auch will bzw. brauche
Delphi-Quellcode:
//
// base code by sakura ([url]http://www.delphipraxis.net/post39547.html[/url])
//
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;

      // get language code
      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);
    finally
      FreeMem(vi);
    end;
  end;
end;
bspw:
Delphi-Quellcode:
s  := GetFileInfo(paramstr(1),'FileDescription');
Das hatte ich bspw. hier benutzt.

Garfield 21. Jul 2004 12:00

Re: Programmname aus .exe-Datei auslesen
 
Fehlt in den Listings die Funktion GetFileVersionInfoSize?

Zitat:

Zitat von MathiasSimmack
vis := GetFileVersionInfoSize(pchar(FileName),dummy);


MathiasSimmack 21. Jul 2004 12:15

Re: Programmname aus .exe-Datei auslesen
 
Das ist eine [msdn:aaeaf0a2c1="GetFileVersionInfoSize"]API-Funktion[/msdn:aaeaf0a2c1] (Windows-Unit), die du übrigens auch im von dir zitierten Beispiel von sakura findest.

Garfield 21. Jul 2004 12:42

Re: Programmname aus .exe-Datei auslesen
 
:( Habe meinen Fehler gefunden. Hatte eine neue Unit genommen und die USES vergessen.

Nachtrag: Jetzt funktioniert es. InternalName und ProductVersion bekomme ich.

dopeline 21. Jul 2004 13:19

Re: Programmname aus .exe-Datei auslesen
 
Vielen Dank! Es funktioniert!

Gruß, dopeline

Garfield 21. Jul 2004 15:22

Re: Programmname aus .exe-Datei auslesen
 
Ist das in Ordnung, dass jedem String ein Steuerzeichen anhängt, welches den Rest der Zeile löscht?

Heißt, wenn ich (StringInternalName + StringProductVersion) - bzw umgekehrt - ausgeben lasse, wird immer nur der erste String ausgegeben. Erst nach Ausführung von TrimRight funktioniert es richtig.

franksch88 21. Jul 2004 15:32

Re: Programmname aus .exe-Datei auslesen
 
Vielleicht solltest du dir mal die VirtualShellTools angucken (bei www.mustangpeak.net)... Sind wirklich gute Explorer-like komponenten die dir fast alle shell funktionen erlauben. Da kommt eine Demo namens "Namespace Browser", wenn du sie dir anguckst, wirst du staunen wieviele Details du von einer Datei oder eines Ordners ermitteln kannst.. Attributes, File system, Compression, relative path, absolute path, icons, version, erstellungsdatum, größe, "PROGRAMM NAME", und sogar den Hilfe-Text was der explorer anzeigt (Zum Beispiel, bei Arbeitsplatz: "Zeigt die an diesen Computer angeschlossenen Laufwerke und Hardware an")

MathiasSimmack 21. Jul 2004 16:28

Re: Programmname aus .exe-Datei auslesen
 
Zitat:

Zitat von Garfield
Ist das in Ordnung, dass jedem String ein Steuerzeichen anhängt, welches den Rest der Zeile löscht?

Nein, in Ordnung ist das nicht. Es schadet zwar auch nicht, wenn die #0 am Ende dran hängt, aber wie du schon bemerkt hast: Wenn man zwei Strings miteinander verbinden will, dann wird alles nach der #0 natürlich ignoriert.

Das wäre das Indiz, dass die Funktion "VerQueryValue" als Puffergröße ein zusätzliches Zeichen zurückliefert. Wenn du von der Funktion redest, die ich auf der letzten Seite gepostet habe, dann ändere die Zeile
Delphi-Quellcode:
SetString(Result,pchar(ip),vis);
einfach in
Delphi-Quellcode:
SetString(Result,pchar(ip),vis - 1);
Klappt genauso, wie ich gerade ausprobiert habe, und löst das Problem. ;)

Garfield 21. Jul 2004 18:46

Re: Programmname aus .exe-Datei auslesen
 
Zitat:

Zitat von MathiasSimmack
Klappt genauso, wie ich gerade ausprobiert habe, und löst das Problem. ;)

:hello: Das Problem wäre gelöst. Damit läuft mein Testprogramm ordentlich.

Was ich allerdings nicht verstehe, ist, dass die Routine in meinem Programm mit Delphi 3 Prof unter Win98SE nicht will. Wenn der erste Wert in der INI geladen wird, gibt es eine Zugriffsverletzung. Denn beim Lesen des InternalName des Programmes wird nicht von

Code:
FreeMem(vi);
ans Ende der Procedure GetFileInfo sondern direkt ans Ende der Procedure INI_laden gesprungen. Unter WinXP tritt dieser Fehler nicht auf.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:53 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz