![]() |
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 |
Re: Programmpfad anderer Programme ermitteln
Schau dir mal die Delphi Hilfe zu TRegistry an.
|
Re: Programmpfad anderer Programme ermitteln
Delphi-Quellcode:
So z. B. ;-)
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; |
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; |
Re: Programmpfad anderer Programme ermitteln
Danke für die schnellen Antworten! :thumb:
Jedoch ein Problem:
Code:
Soweit schön und gut, aber beim Ausführen kommt folgende Meldung:
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;
Code:
[Fehler] Unit1.pas(31): E2003 Undefinierter Bezeichner: 'root'
|
Re: Programmpfad anderer Programme ermitteln
Das muss
Delphi-Quellcode:
heißen.
reg.RootKey := HKEY_LOCAL_MACHINE;
|
Re: Programmpfad anderer Programme ermitteln
Jepp, Sch... C&P :mrgreen:
|
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<? |
Re: Programmpfad anderer Programme ermitteln
Zitat:
Ein Beispiel zu GetKeyNames - das jedoch abgeändert muss - findest du ![]() |
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 |
Re: Programmpfad anderer Programme ermitteln
Zeig doch mal den Source, wir können nicht hellsehen :glaskugel:
|
Re: Programmpfad anderer Programme ermitteln
Da scheinen einige Units in des Uses zu fehlen
|
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; |
Re: Programmpfad anderer Programme ermitteln
Jaja, das böse with. TRegistry kennt keine Eigenschaft ListView1.
|
Re: Programmpfad anderer Programme ermitteln
Und was kann man tun?
Bzw. gibt es eine andere Möglichkeit? |
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;
|
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; |
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.
|
Re: Programmpfad anderer Programme ermitteln
Zeig mal deine Uses
|
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; |
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?
|
Re: Programmpfad anderer Programme ermitteln
Es fehlt ComCtrls in den Uses
|
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:
Wenn ich nichts übersehen habe, sollte das so gehen.
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; |
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 |
Re: Programmpfad anderer Programme ermitteln
Poste mal die komplette Unit
|
Re: Programmpfad anderer Programme ermitteln
ListView1 liegt aber auf Form2?
|
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. |
Re: Programmpfad anderer Programme ermitteln
Zitat:
|
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.
|
Re: Programmpfad anderer Programme ermitteln
Vielleicht helfen etwas
![]() |
Re: Programmpfad anderer Programme ermitteln
Form1 gibt's gar nicht, das ist ein anderes Projekt...
|
Re: Programmpfad anderer Programme ermitteln
Und wo ist die Listview bitteschön drauf?
|
Re: Programmpfad anderer Programme ermitteln
Dann lege doch mal einen ListView auf die Form
|
Re: Programmpfad anderer Programme ermitteln
Zitat:
|
Re: Programmpfad anderer Programme ermitteln
Aus Toolbox oder Palette nehmen und auf Form ablegen
|
Re: Programmpfad anderer Programme ermitteln
Und ViewStyle auf vsReport stellen
|
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 |
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 |
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. |
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 22:54 Uhr. |
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 by Thomas Breitkreuz