Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Programmpfad anderer Programme ermitteln (https://www.delphipraxis.net/118494-programmpfad-anderer-programme-ermitteln.html)

Chrischi 8. Aug 2008 17:58


Programmpfad anderer Programme ermitteln
 
Hallo,

ich möchte in einem meiner Programme den Programmpfad eines anderen Programms ermitteln. Das Programm ist nicht nur für mich gedacht, es ist also auch keine Lösung, das Programm auf meiner Festplatte zu suchen, da ich stark bezweifle, dass jeder seine Programme genau da gespeichert hat, wo ich sie habe.

Die SuFu dieses Forums hat mir nicht wirklich geholfen. Ich habe lediglich herausgefunden, dass man den Pfad in der Registry herausfinden kann: HKEY_LOCAL_MASCHINE -> SOFTWARE -> Mircosoft -> Windows -> CurrentVersion -> Uninstall. Der Name des Wertes, der den Programmpfad angibt, lautet "InstallLocation".

Doch, wie greife ich jetzt auf die Registry zu, bzw. wie lese ich "InstallLocation" mithilfe von Delphi aus?

Danke schon mal für die Antworten!

Gruß,
Chrischi

HalloDu 8. Aug 2008 18:01

Re: Programmpfad anderer Programme ermitteln
 
Schau dir mal die Delphi Hilfe zu TRegistry an.

Andreas L. 8. Aug 2008 18:15

Re: Programmpfad anderer Programme ermitteln
 
Delphi-Quellcode:
uses ..., Registry;

...
...

function GetPath:String;
var
  reg: tregistry;
begin
  Result := '';
  reg := Tregistry.create;
  reg.root := HKEY_LOCAL_MACHINE;
  if reg.openkeyreadonly('Software\Microsoft\Windows\CurrentVersion\Uninstall\DEINAPPNAME') then
  begin
    Result := reg.readstring('InstallLocation');
  end;
  reg.free;
end;
So z. B. ;-)

DeddyH 8. Aug 2008 18:21

Re: Programmpfad anderer Programme ermitteln
 
Wenn, dann bitte so:
Delphi-Quellcode:
uses ..., Registry;

...
...

function GetPath:String;
var
  reg: tregistry;
begin
  Result := '';
  reg := Tregistry.create;
  try
    reg.root := HKEY_LOCAL_MACHINE;
    if reg.openkeyreadonly('Software\Microsoft\Windows\CurrentVersion\Uninstall\DEINAPPNAME') then
    begin
      Result := reg.readstring('InstallLocation');
    end;
  finally
    reg.free;
  end;
end;

Chrischi 8. Aug 2008 18:30

Re: Programmpfad anderer Programme ermitteln
 
Danke für die schnellen Antworten! :thumb:

Jedoch ein Problem:
Code:
function GetPath:String;
var
  reg: tregistry;
begin
  Result := '';
  reg := Tregistry.create;
  try
    reg.root := HKEY_LOCAL_MACHINE;
    if reg.openkeyreadonly('Software\Microsoft\Windows\CurrentVersion\Uninstall\Mozilla Firefox (3.0.1)') then
    begin
      Result := reg.readstring('InstallLocation');
    end;
  finally
    reg.free;
  end;
end;
Soweit schön und gut, aber beim Ausführen kommt folgende Meldung:
Code:
[Fehler] Unit1.pas(31): E2003 Undefinierter Bezeichner: 'root'

bigben37 8. Aug 2008 18:39

Re: Programmpfad anderer Programme ermitteln
 
Das muss

Delphi-Quellcode:
reg.RootKey := HKEY_LOCAL_MACHINE;
heißen.

DeddyH 8. Aug 2008 18:44

Re: Programmpfad anderer Programme ermitteln
 
Jepp, Sch... C&P :mrgreen:

Chrischi 8. Aug 2008 18:46

Re: Programmpfad anderer Programme ermitteln
 
Klappt, super, danke!

Letzte Frage: Nehmen wir mal an, das Programm soll den Pfad von Firefox ermitteln. Nun gibt es aber verschiedene Versionen. Bei mir steht "Mozilla Firefox (3.0.1)" in der Registry. Was aber, wenn andere User eine andere Version haben? Gibt es so etwas wie einen >Platzhalter<?

toms 8. Aug 2008 19:25

Re: Programmpfad anderer Programme ermitteln
 
Zitat:

Zitat von Chrischi
Klappt, super, danke!

Letzte Frage: Nehmen wir mal an, das Programm soll den Pfad von Firefox ermitteln. Nun gibt es aber verschiedene Versionen. Bei mir steht "Mozilla Firefox (3.0.1)" in der Registry. Was aber, wenn andere User eine andere Version haben? Gibt es so etwas wie einen >Platzhalter<?

Durchlaufe einfach alle Keys und überprüfe mit POS, ob der String 'Mozilla Firefox' enthalten ist.
Ein Beispiel zu GetKeyNames - das jedoch abgeändert muss - findest du hier.

Chrischi 8. Aug 2008 19:35

Re: Programmpfad anderer Programme ermitteln
 
Was genau muss ich da ändern?

Wenn ichs so versuche zu starten, kommen folgende Meldungen:
Code:
[Fehler] Unit1.pas(36): E2003 Undefinierter Bezeichner: 'TlistItem'
[Fehler] Unit1.pas(52): E2003 Undefinierter Bezeichner: 'ListView1'
[Fehler] Unit1.pas(54): E2003 Undefinierter Bezeichner: 'BeginUpdate'
[Fehler] Unit1.pas(55): E2003 Undefinierter Bezeichner: 'Clear'
[Fehler] Unit1.pas(70): E2003 Undefinierter Bezeichner: 'Add'
[Fehler] Unit1.pas(71): E2066 Operator oder Semikolon fehlt
[Fehler] Unit1.pas(72): E2066 Operator oder Semikolon fehlt
[Fehler] Unit1.pas(82): E2066 Operator oder Semikolon fehlt
[Fehler] Unit1.pas(83): E2003 Undefinierter Bezeichner: 'EndUpdate'
[Fataler Fehler] Project1.dpr(5): F2063 Verwendete Unit 'Unit1.pas' kann nicht compiliert werden

DeddyH 8. Aug 2008 19:42

Re: Programmpfad anderer Programme ermitteln
 
Zeig doch mal den Source, wir können nicht hellsehen :glaskugel:

mkinzler 8. Aug 2008 19:49

Re: Programmpfad anderer Programme ermitteln
 
Da scheinen einige Units in des Uses zu fehlen

Chrischi 8. Aug 2008 19:50

Re: Programmpfad anderer Programme ermitteln
 
Folgt doch dem Link, dann habt ihr ihn. ;-)

Code:
procedure TForm1.FormCreate(Sender: TObject);
const
  UNINST_PATH = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall';
var
  Reg: TRegistry;
  SubKeys: TStringList;
  ListItem: TlistItem;
  i: integer;
  sDisplayName, sUninstallString: string;
begin
{
  ListView1.ViewStyle := vsReport;
  ListView1.Columns.add;
  ListView1.Columns.add;
  ListView1.Columns[0].caption := 'DisplayName';
  ListView1.Columns[1].caption := 'UninstallString';
  ListView1.Columns[0].Width := 300;
  ListView1.Columns[1].Width := 300;
}
  Reg := TRegistry.Create;
  with Reg do
    try
      with ListView1.Items do
        try
          BeginUpdate;
          Clear;
          RootKey := HKEY_LOCAL_MACHINE;
          if OpenKeyReadOnly(UNINST_PATH) then
          begin
            SubKeys := TStringList.Create;
            try
              GetKeyNames(SubKeys);
              CloseKey;
              for i := 0 to subKeys.Count - 1 do
                if OpenKeyReadOnly(Format('%s\%s', [UNINST_PATH, SubKeys[i]])) then
                  try
                    sDisplayName    := ReadString('DisplayName');
                    sUninstallString := ReadString('UninstallString');
                    if sDisplayName <> '' then
                    begin
                      ListItem        := Add;
                      ListItem.Caption := sDisplayName;
                      ListItem.subitems.Add(sUninstallString);
                    end;
                  finally
                    CloseKey;
                  end;
            finally
              SubKeys.Free;
            end;
          end;
        finally
          ListView1.AlphaSort;
          EndUpdate;
        end;
    finally
      CloseKey;
      Free;
    end;
end;

DeddyH 8. Aug 2008 19:54

Re: Programmpfad anderer Programme ermitteln
 
Jaja, das böse with. TRegistry kennt keine Eigenschaft ListView1.

Chrischi 8. Aug 2008 20:01

Re: Programmpfad anderer Programme ermitteln
 
Und was kann man tun?

Bzw. gibt es eine andere Möglichkeit?

DeddyH 8. Aug 2008 20:03

Re: Programmpfad anderer Programme ermitteln
 
Natürlich. Lösch die withs raus und schreib vor alle Felder den Instanznamen davor. Also statt (Beispiel)
Delphi-Quellcode:
with Reg do
  RootKey := HKEY_LOCAL_MACHINE;
Delphi-Quellcode:
Reg.RootKey := HKEY_LOCAL_MACHINE;

Chrischi 8. Aug 2008 20:25

Re: Programmpfad anderer Programme ermitteln
 
Also genützt hat's nicht. :-(

Delphi-Quellcode:
procedure TForm2.FormCreate(Sender: TObject);
const
  UNINST_PATH = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall';
var
  Reg: TRegistry;
  SubKeys: TStringList;
  ListItem: TlistItem;
  i: integer;
  sDisplayName, sUninstallString: string;
begin
{
  ListView1.ViewStyle := vsReport;
  ListView1.Columns.add;
  ListView1.Columns.add;
  ListView1.Columns[0].caption := 'DisplayName';
  ListView1.Columns[1].caption := 'UninstallString';
  ListView1.Columns[0].Width := 300;
  ListView1.Columns[1].Width := 300;
}
  Reg := TRegistry.Create;

    try

        try
         Reg.BeginUpdate;
          Reg.Clear;
          Reg.RootKey := HKEY_LOCAL_MACHINE;
          if OpenKeyReadOnly(UNINST_PATH) then
          begin
            SubKeys := TStringList.Create;
            try
              GetKeyNames(SubKeys);
              CloseKey;
              for i := 0 to subKeys.Count - 1 do
                if OpenKeyReadOnly(Format('%s\%s', [UNINST_PATH, SubKeys[i]])) then
                  try
                    sDisplayName    := ReadString('DisplayName');
                    sUninstallString := ReadString('UninstallString');
                    if sDisplayName <> '' then
                    begin
                      ListItem        := Add;
                      ListItem.Caption := sDisplayName;
                      ListItem.subitems.Add(sUninstallString);
                    end;
                  finally
                    CloseKey;
                  end;
            finally
              SubKeys.Free;
            end;
          end;
        finally
          ListView1.AlphaSort;
          EndUpdate;
        end;
    finally
      CloseKey;
      Free;
    end;
end;

DeddyH 8. Aug 2008 20:28

Re: Programmpfad anderer Programme ermitteln
 
Du musst das natürlich überall machen und auch die richtige Instanz nehmen. BeginUpdate z.B. gehört nicht zu Reg, sondern zu Listview1.Items. Lass künftig das with besser weg, es sei denn, Du weißt haargenau, was Du tust.

mkinzler 8. Aug 2008 20:29

Re: Programmpfad anderer Programme ermitteln
 
Zeig mal deine Uses

Chrischi 8. Aug 2008 20:32

Re: Programmpfad anderer Programme ermitteln
 
Die withs kommen doch nicht von mir, sondern von diesem Link...

So, hab's bearbeitet, jedoch nach wie vor die gleichen Fehlermeldungen!
Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Registry;

procedure TForm2.FormCreate(Sender: TObject);
const
  UNINST_PATH = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall';
var
  Reg: TRegistry;
  SubKeys: TStringList;
  ListItem: TlistItem;
  i: integer;
  sDisplayName, sUninstallString: string;
begin
{
  ListView1.ViewStyle := vsReport;
  ListView1.Columns.add;
  ListView1.Columns.add;
  ListView1.Columns[0].caption := 'DisplayName';
  ListView1.Columns[1].caption := 'UninstallString';
  ListView1.Columns[0].Width := 300;
  ListView1.Columns[1].Width := 300;
}
  Reg := TRegistry.Create;

    try

        try
           Listview1.Items.BeginUpdate;
           Listview1.Items.Clear;
           Reg.RootKey := HKEY_LOCAL_MACHINE;
          if OpenKeyReadOnly(UNINST_PATH) then
          begin
            SubKeys := TStringList.Create;
            try
              GetKeyNames(SubKeys);
              CloseKey;
              for i := 0 to subKeys.Count - 1 do
                if OpenKeyReadOnly(Format('%s\%s', [UNINST_PATH, SubKeys[i]])) then
                  try
                    sDisplayName    := ReadString('DisplayName');
                    sUninstallString := ReadString('UninstallString');
                    if sDisplayName <> '' then
                    begin
                      ListItem        := Add;
                      ListItem.Caption := sDisplayName;
                      ListItem.subitems.Add(sUninstallString);
                    end;
                  finally
                    CloseKey;
                  end;
            finally
              SubKeys.Free;
            end;
          end;
        finally
          ListView1.AlphaSort;
          EndUpdate;
        end;
    finally
      CloseKey;
      Free;
    end;
end;

Larsi 8. Aug 2008 20:33

Re: Programmpfad anderer Programme ermitteln
 
Also eigentlich kann in dem Code doch gar kein Fehler sein, der kommt ja ausm Delphi Swiss Center meiner Meinung nach. Dort stand doch auch was du einbinden musst oder?

mkinzler 8. Aug 2008 20:36

Re: Programmpfad anderer Programme ermitteln
 
Es fehlt ComCtrls in den Uses

DeddyH 8. Aug 2008 20:38

Re: Programmpfad anderer Programme ermitteln
 
Himmel, Gesäß und Nähgarn, ich hasse diese Code-Kopiererei ohne Hintergrundwissen :wall:. Also gut, ich vervollständige das mal:
Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Registry;

procedure TForm2.FormCreate(Sender: TObject);
const
  UNINST_PATH = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall';
var
  Reg: TRegistry;
  SubKeys: TStringList;
  ListItem: TlistItem;
  i: integer;
  sDisplayName, sUninstallString: string;
begin
{
  ListView1.ViewStyle := vsReport;
  ListView1.Columns.add;
  ListView1.Columns.add;
  ListView1.Columns[0].caption := 'DisplayName';
  ListView1.Columns[1].caption := 'UninstallString';
  ListView1.Columns[0].Width := 300;
  ListView1.Columns[1].Width := 300;
}
  Reg := TRegistry.Create;

    try

        try
           Listview1.Items.BeginUpdate;
           Listview1.Items.Clear;
           Reg.RootKey := HKEY_LOCAL_MACHINE;
          if Reg.OpenKeyReadOnly(UNINST_PATH) then //hier
          begin
            SubKeys := TStringList.Create;
            try
              Reg.GetKeyNames(SubKeys); //und hier
              Reg.CloseKey; //und hier
              for i := 0 to subKeys.Count - 1 do
                if Reg.OpenKeyReadOnly(Format('%s\%s', [UNINST_PATH, SubKeys[i]])) then //und hier
                  try
                    sDisplayName    := Reg.ReadString('DisplayName'); //und hier
                    sUninstallString := Reg.ReadString('UninstallString'); //und hier
                    if sDisplayName <> '' then
                    begin
                      ListItem        := Listview1.Add; //und hier
                      ListItem.Caption := sDisplayName;
                      ListItem.subitems.Add(sUninstallString);
                    end;
                  finally
                    Reg.CloseKey; //und hier
                  end;
            finally
              SubKeys.Free;
            end;
          end;
        finally
          ListView1.AlphaSort;
          Listview1.Items.EndUpdate; //und hier
        end;
    finally
      Reg.CloseKey; //und hier
      Reg.Free; //und hier
    end;
end;
Wenn ich nichts übersehen habe, sollte das so gehen.

Chrischi 8. Aug 2008 20:41

Re: Programmpfad anderer Programme ermitteln
 
Hab ich gerade eingefügt. Also Fehlermeldungen sind schon mal weniger:

Delphi-Quellcode:
[Fehler] Unit2.pas(49): E2003 Undefinierter Bezeichner: 'Listview1'
[Fehler] Unit2.pas(49): E2066 Operator oder Semikolon fehlt
[Fehler] Unit2.pas(50): E2066 Operator oder Semikolon fehlt
[Fehler] Unit2.pas(65): E2066 Operator oder Semikolon fehlt
[Fehler] Unit2.pas(77): E2066 Operator oder Semikolon fehlt
[Fehler] Unit2.pas(78): E2066 Operator oder Semikolon fehlt
[Fataler Fehler] Project2.dpr(5): F2063 Verwendete Unit 'Unit2.pas' kann nicht compiliert werden

mkinzler 8. Aug 2008 20:43

Re: Programmpfad anderer Programme ermitteln
 
Poste mal die komplette Unit

DeddyH 8. Aug 2008 20:44

Re: Programmpfad anderer Programme ermitteln
 
ListView1 liegt aber auf Form2?

Chrischi 8. Aug 2008 20:45

Re: Programmpfad anderer Programme ermitteln
 
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Registry, ComCtrls;

type
  TForm2 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
const
  UNINST_PATH = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall';
var
  Reg: TRegistry;
  SubKeys: TStringList;
  ListItem: TlistItem;
  i: integer;
  sDisplayName, sUninstallString: string;
begin
{
  ListView1.ViewStyle := vsReport;
  ListView1.Columns.add;
  ListView1.Columns.add;
  ListView1.Columns[0].caption := 'DisplayName';
  ListView1.Columns[1].caption := 'UninstallString';
  ListView1.Columns[0].Width := 300;
  ListView1.Columns[1].Width := 300;
}
  Reg := TRegistry.Create;

    try
        try
           Listview1.Items.BeginUpdate;
           Listview1.Items.Clear;
           Reg.RootKey := HKEY_LOCAL_MACHINE;
          if Reg.OpenKeyReadOnly(UNINST_PATH) then
          begin
            SubKeys := TStringList.Create;
            try
              Reg.GetKeyNames(SubKeys);
              Reg.CloseKey;
              for i := 0 to subKeys.Count - 1 do
                if Reg.OpenKeyReadOnly(Format('%s\%s', [UNINST_PATH, SubKeys[i]])) then
                  try
                    sDisplayName    := Reg.ReadString('DisplayName');
                    sUninstallString := Reg.ReadString('UninstallString');
                    if sDisplayName <> '' then
                    begin
                      ListItem        := Listview1.Add;
                      ListItem.Caption := sDisplayName;
                      ListItem.subitems.Add(sUninstallString);
                    end;
                  finally
                    Reg.CloseKey;
                  end;
            finally
              SubKeys.Free;
            end;
          end;
        finally
          ListView1.AlphaSort;
          Listview1.Items.EndUpdate;
        end;
    finally
      Reg.CloseKey;
      Reg.Free;
    end;
end;

end.

mkinzler 8. Aug 2008 20:47

Re: Programmpfad anderer Programme ermitteln
 
Zitat:

Zitat von DeddyH
ListView1 liegt aber auf Form2?

Nein, existiert garnicht :wall:

DeddyH 8. Aug 2008 20:47

Re: Programmpfad anderer Programme ermitteln
 
Listview1 liegt anscheinend auf Form1. Also vor jedes "ListView1" "Form1." davorschreiben, damit es erstmal läuft. Guter Stil ist das zwar nicht, aber was soll' s.

mkinzler 8. Aug 2008 20:49

Re: Programmpfad anderer Programme ermitteln
 
Vielleicht helfen etwas Grundlagen zum Verständnis

Chrischi 8. Aug 2008 20:50

Re: Programmpfad anderer Programme ermitteln
 
Form1 gibt's gar nicht, das ist ein anderes Projekt...

DeddyH 8. Aug 2008 20:52

Re: Programmpfad anderer Programme ermitteln
 
Und wo ist die Listview bitteschön drauf?

mkinzler 8. Aug 2008 20:53

Re: Programmpfad anderer Programme ermitteln
 
Dann lege doch mal einen ListView auf die Form

Chrischi 8. Aug 2008 20:54

Re: Programmpfad anderer Programme ermitteln
 
Zitat:

Zitat von mkinzler
Dann lege doch mal einen ListView auf die Form

Und wie? - Hab mit ListView bisher nie gearbeitet?! :?

mkinzler 8. Aug 2008 20:55

Re: Programmpfad anderer Programme ermitteln
 
Aus Toolbox oder Palette nehmen und auf Form ablegen

DeddyH 8. Aug 2008 20:56

Re: Programmpfad anderer Programme ermitteln
 
Und ViewStyle auf vsReport stellen

Chrischi 8. Aug 2008 21:01

Re: Programmpfad anderer Programme ermitteln
 
Delphi-Quellcode:
[Warnung] Unit2.pas(7): W1005 Unit 'ShellCtrls' ist plattformspezifisch
[Fehler] Unit2.pas(49): E2003 Undefinierter Bezeichner: 'Listview1'
[Fehler] Unit2.pas(49): E2066 Operator oder Semikolon fehlt
[Fehler] Unit2.pas(50): E2066 Operator oder Semikolon fehlt
[Fehler] Unit2.pas(65): E2066 Operator oder Semikolon fehlt
[Fehler] Unit2.pas(77): E2066 Operator oder Semikolon fehlt
[Fehler] Unit2.pas(78): E2066 Operator oder Semikolon fehlt
[Fataler Fehler] Project2.dpr(5): F2063 Verwendete Unit 'Unit2.pas' kann nicht compiliert werden

Chrischi 8. Aug 2008 21:03

Re: Programmpfad anderer Programme ermitteln
 
Ups, hatte TShellViewList...

Aber jetzt
Delphi-Quellcode:
[Fehler] Unit2.pas(65): E2003 Undefinierter Bezeichner: 'Add'
[Fataler Fehler] Project2.dpr(5): F2063 Verwendete Unit 'Unit2.pas' kann nicht compiliert werden

toms 8. Aug 2008 21:04

Re: Programmpfad anderer Programme ermitteln
 
Hallo

Die ListView brauchst du mit den Daten gar nicht zu füllen.
Wie schon oben geschrieben, der Code muss noch an deine Bedürfnisse angepasst werden.

DeddyH 8. Aug 2008 21:06

Re: Programmpfad anderer Programme ermitteln
 
Mach mal aus
Delphi-Quellcode:
Listview1.Add;
Delphi-Quellcode:
Listview1.Items.Add;


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

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