![]() |
Liste der Exe-Pfade aller installierten Programme
Hallo!
Ich hab jetzt wirklich lange gesucht, aber nichhts Passendes gefunden: Wie kann man eine Liste der EXE-Pfade aller installierten Programme erhalten, sowohl 32bit als auch 64bit, XP bis W7? Also nicht die Liste der Displaynamen oder die Liste der Uninstall-Programme, sondern z.B.: Zitat:
|
AW: Liste der Exe-Pfade aller installierten Programme
Delphi-Quellcode:
Ansonsten die Frage genauer stellen.
procedure GetFiles(Path, ExtMask: String; List: TStrings; SubFolder: Boolean);
const Attrib = faArchive or faReadOnly or faHidden; var Tmp: String; k: Integer; Search: TSearchRec; begin Path := IncludeTrailingBackslash(Path); with TStringList.Create do try CommaText := ExtMask; for k := 0 to Count - 1 do begin Tmp := Strings[k]; //Entfernt führenden Punkt vor der Ext while Copy(Tmp, 1, 1) = '.' do System.Delete(Tmp, 1, 1); Strings[k] := Tmp; if FindFirst(Path + '*.' + Strings[k], Attrib, Search) = 0 then repeat if List.IndexOf(Path + Search.Name) < 0 then //Doppelte Filtern List.Add(Path + Search.Name); until FindNext(Search) <> 0; end; FindClose(Search); finally Free end; //---------------------------------------------------------------------------- //Application.ProcessMessages; if SubFolder then begin if FindFirst(Path + '*.*', faDirectory, Search) = 0 then begin repeat if ((Search.Attr and faDirectory) = faDirectory) and (Search.Name[1] <> '.') then GetFiles(Path + Search.Name, ExtMask, List, SubFolder); until FindNext(Search) <> 0; FindClose(Search); end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin GetFiles('c:\', 'exe', ListBox1.Items, True); end; |
AW: Liste der Exe-Pfade aller installierten Programme
Danke, aber das ist nicht das, was ich suchte. Eine Dateisuche findet auch Programme, die nicht installiert wurden.
|
AW: Liste der Exe-Pfade aller installierten Programme
Ist
![]() |
AW: Liste der Exe-Pfade aller installierten Programme
Was ist mit der Registry?
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uni nstall |
AW: Liste der Exe-Pfade aller installierten Programme
|
AW: Liste der Exe-Pfade aller installierten Programme
Zitat:
Dabei wirst du deiner Lösung von selber näher kommen. BTW: Das meinte Popov mit "Ansonsten die Frage genauer stellen" ;) |
AW: Liste der Exe-Pfade aller installierten Programme
Zitat:
Nein. Abgesehen davon, dass dieser Code voller Fehler ist, liefert er nur die Uninstall-Displaynamen, was ich ja in meiner obigen Definition ausgeschlossen habe. Hier ist der soweit entwanzte Code, der das nicht brauchbare Ergebnis liefert:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
const REGKEYAPPS = '\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\'; var reg: TRegistry; List1: TStringList; List2: TStringList; j, n: Integer; begin reg := TRegistry.Create; List1 := TStringList.Create; List2 := TStringList.Create; { Load all the subkeys } with reg do begin RootKey := HKEY_LOCAL_MACHINE; Access := KEY_READ; // WICHTIG WEGEN UAC ! OpenKey(REGKEYAPPS, false); GetKeyNames(List1); end; { Load all the Value Names } for j := 0 to List1.Count - 1 do begin reg.OpenKey(REGKEYAPPS + '' + List1.Strings[j], false); reg.GetValueNames(List2); { We will show only if there is 'DisplayName' } n := List2.IndexOf('DisplayName'); if (n <> -1) and (List2.IndexOf('UninstallString') <> -1) then begin memoPrograms.Lines.Add((reg.ReadString(List2.Strings[n]))); end; end; List1.Free; List2.Free; reg.CloseKey; reg.Destroy; end; |
AW: Liste der Exe-Pfade aller installierten Programme
Zitat:
In diesem Registry-Zweig sind nur die Uninstall-Schlüssel, die nicht die Exe-Pfade der Programme enthalten. Außer: Einige wenige Unterzweige von 'Uninstall' enthalten den Schlüssel 'DisplayIcon' mit dem Exe-Pfad; dies sind jedoch nur wenige Programme insgesamt. Und die Uninstall-Werte habe ich ja durch meine obige Definition ausgeschlossen. |
AW: Liste der Exe-Pfade aller installierten Programme
Zitat:
Siehe Beiträge 8 und 9. Edit: Lies bitte nochmal meine Frage. |
AW: Liste der Exe-Pfade aller installierten Programme
@PeterPanino
Es gibt unterschiedliche Installer, die auf unterschiedliche Art und Weise sich merken (oder eben auch nicht) welche Programme (exe Files) wohin kopiert wurden. Ein Installer muss sich nicht zwangsläufig merken, was er kopiert hat. Es gibt Installer, die das machen, aber nicht jeder. Somit ist es unmöglich so eine Liste zu erstellen, wenn man lapidar "alle installierten exe-Dateien" fordert. Bitte konkretisiere deine Frage dahingehend. Zitat:
Ich schreibe dir gerne einen Installer, wo das nicht geht. |
AW: Liste der Exe-Pfade aller installierten Programme
Ich finde auf meinem Rechner allerdings auch die "InstallLocation", das kann natürlich auch eine Ausnahme sein.
Gruß K-H |
AW: Liste der Exe-Pfade aller installierten Programme
IIRC enthält der aber nur das Verzeichnis, oder?
|
AW: Liste der Exe-Pfade aller installierten Programme
Wie wäre es, wenn man das Startmenü durchsucht und von dort aus den Shortcut-Targets die Liste der Exe-Dateien holt?
|
AW: Liste der Exe-Pfade aller installierten Programme
Wessen Startmenü, es gibt ja eins je Benutzer? Und es gibt auch Installationen, die die Erstellung einer Startmenü-Verknüpfung optional anbieten.
|
AW: Liste der Exe-Pfade aller installierten Programme
@PeterPanino
Eine Liste die du suchst wirst du als solches wahrscheinlich sowieso nicht finden. Entweder du gehst Kompromisse ein oder bastelst dir aus verschiedenen Listen eine Liste, die auch nur eine grobe Liste sein wird. Die Liste sich aus Startmenü holen ist zwar eine gute Idee, aber auch nicht 100%. Dann man hat die Möglichkeit global, wie auch lokal für ein Konto zu installieren. Und dann gibt es Installer die kriegen es mit den Berechtigungen nicht richtig hin. Unter Admin kriegt man die Programme gesehen und gestartet, unter eingeschränkten User gerade mal nur die Namen gelesen. Der Rest ist weg, da man nicht die Rechte hat. |
AW: Liste der Exe-Pfade aller installierten Programme
Zitat:
Das Startmenü des aktuell angemeldeten Benutzers und das Startmenü für alle Benutzer. |
AW: Liste der Exe-Pfade aller installierten Programme
Darf man fragen, wofür du das brauchst?
In meinem Startmenü wirst du übrigens nicht viel finden ;-) |
AW: Liste der Exe-Pfade aller installierten Programme
Zitat:
Ich möchte abfragen, ob Programme aus einer vorgegebenen eigenen Liste (welche durch keine Regel definiert ist) installiert sind, UND ich brauche deren Exe-Pfade. |
AW: Liste der Exe-Pfade aller installierten Programme
Wie wäre es den umgekehrten Weg zu gehen, findest Du die vorhandenen Programm-Pfade im Uninstall Verzeichnis?
Dann hättest Du zumindestens die Möglichkeit Deine Informationen zu klassifizieren. Gruß K-H |
AW: Liste der Exe-Pfade aller installierten Programme
Zitat:
In #2 hat Popov schon einen brauchbaren Ansatz geliefert, der aber für alle Laufwerke mit gewissewn Ordnern... Aber es ist ja "keine Regel definiert" :evil::twisted: Denn sie wissen nicht, was sie tun wollen, oder? |
AW: Liste der Exe-Pfade aller installierten Programme
Vielleicht ist das auch interessant:
![]() Das, mit alle Verknüpfungen in den Startmenüs auslesen, ergibt die tatsächlichen Dateien der Startmenüs. Dann noch Exe filtern. Damit findest du die Startmenüs ![]() |
AW: Liste der Exe-Pfade aller installierten Programme
Die Methode via Startmenü halte ich für genauso fehlerträchtig wie die anderen, weil im Startmenü pro Programm eine ganze Reihe von EXE-Dateien verknüpft sein können: das Programm selbst, ein Uninstaller, ein/mehrere Hilfsprogramm(e), das Programm selbst mit anderen Aufrufparametern (OK, die dadurch entstehenden Doppelungen kann man filtern) usw.
MfG Dalai |
AW: Liste der Exe-Pfade aller installierten Programme
Zitat:
|
AW: Liste der Exe-Pfade aller installierten Programme
Zitat:
Was meint denn der TE inzwischen zu den abgelieferten Antworten? |
AW: Liste der Exe-Pfade aller installierten Programme
Zitat:
Was meinst du mit "Uninstall Verzeichnis"? Was meinst du mit "klassifizieren"? |
AW: Liste der Exe-Pfade aller installierten Programme
Zitat:
Nein. |
AW: Liste der Exe-Pfade aller installierten Programme
Zitat:
Ich möchte abfragen, ob Programme aus einer vorgegebenen eigenen Liste (welche durch keine Regel definiert ist) installiert sind, UND ich brauche deren Exe-Pfade. Die Art der Filterung stellt sicher, dass nur die Exes der Hauptprogramme gefunden werden. |
AW: Liste der Exe-Pfade aller installierten Programme
Zitat:
Vielen Dank für die Links! Die JCL hat ebenso Funktionen dafür. |
AW: Liste der Exe-Pfade aller installierten Programme
Zitat:
S.u.u.o. |
AW: Liste der Exe-Pfade aller installierten Programme
Zitat:
Zitat:
|
AW: Liste der Exe-Pfade aller installierten Programme
6 aufeinanderfolgene Beiträge innerhalb einer halben Stunde, wenn das kein Pushen ist... Außerdem kann ich mit der Beschreibung wenig bis gar nichts anfangen, wie soll man da weiterhelfen?
|
AW: Liste der Exe-Pfade aller installierten Programme
Bitte keine "Hilfe" mehr. Ich habe eine Lösung und poste sie später.
|
AW: Liste der Exe-Pfade aller installierten Programme
Zitat:
Zitat:
MfG Dalai |
AW: Liste der Exe-Pfade aller installierten Programme
Zitat:
Zitat:
Aber vielen Dank vorerst mal an alle, die mir helfen wollten! :-D |
AW: Liste der Exe-Pfade aller installierten Programme
Hier ist der Code:
Delphi-Quellcode:
Ich prüfe damit, welche aus einer bestimmten Liste von Grafikprogrammen installiert sind. Die Suchstrings müssen lowercase sein und sind Teilstrings der Startmenüeinträge.
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, System.StrUtils, //CodeSiteLogging, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, JclSysInfo, JclFileUtils, JclShell; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure DoCheckIfSomeProgramsAreInstalled(const slPrograms, slResults: TStringList); var i, j: Integer; sCommonStartmenuFolder, sStartmenuFolder: string; slShortcuts: TStringList; ThisShellLinkRecord: JclShell.TShellLink; ThisTargetExePath: string; begin sCommonStartmenuFolder := JclFileUtils.PathAddSeparator(JclSysInfo.GetCommonStartmenuFolder); sStartmenuFolder := JclFileUtils.PathAddSeparator(JclSysInfo.GetStartmenuFolder); slShortcuts := TStringList.Create; try JclFileUtils.AdvBuildFileList(sCommonStartmenuFolder + '*.lnk', faAnyFile, slShortcuts, amAny, [flFullNames, flRecursive]); JclFileUtils.AdvBuildFileList(sStartmenuFolder + '*.lnk', faAnyFile, slShortcuts, amAny, [flFullNames, flRecursive]); for i := 0 to slShortcuts.Count - 1 do begin for j := 0 to slPrograms.Count - 1 do begin if Pos(slPrograms[j], AnsiLowerCaseFileName(ExtractFileName(slShortcuts[i]))) > 0 then begin JclShell.ShellLinkResolve(slShortcuts[i], ThisShellLinkRecord); ThisTargetExePath := JclFileUtils.PathGetLongName(ThisShellLinkRecord.Target); if CompareText('.exe', ExtractFileExt(ThisTargetExePath)) = 0 then begin if Pos('unins', AnsiLowerCaseFileName(ExtractFileName(ThisTargetExePath))) = 0 then slResults.Add(ThisTargetExePath); end; end; end; end; finally slShortcuts.Free; end; end; procedure CheckIfTheseProgramsAreInstalled(const rgPrograms: array of string); var i: Integer; slPrograms: TStringList; ProgramNames: string; slResults: TStringList; begin slPrograms := TStringList.Create; slResults := TStringList.Create; try slResults.Sorted := True; slResults.Duplicates := dupIgnore; // ################################################ if Length(rgPrograms) = 0 then begin // Load lowercase! program names: ProgramNames := PathAddSeparator(ExtractFilePath(Application.ExeName)) + 'ProgramNames.txt'; slPrograms.LoadFromFile(ProgramNames); end else begin for i := Low(rgPrograms) to High(rgPrograms) do slPrograms.Add(rgPrograms[i]); end; // ################################################ Screen.Cursor := crHourGlass; try DoCheckIfSomeProgramsAreInstalled(slPrograms, slResults); finally Screen.Cursor := crDefault; end; // Ergebnis ausgeben: //CodeSite.Send('slResults', slResults); slResults.SaveToFile(PathAddSeparator(ExtractFilePath(Application.ExeName)) + 'Results.txt'); finally slPrograms.Free; slResults.Free; end; end; procedure TForm1.FormCreate(Sender: TObject); begin // Aufruf 1 (Laden der gesuchten Programme aus Textdatei): CheckIfTheseProgramsAreInstalled([]); // ODER Aufruf 2 (gesuchte Programme übergeben): CheckIfTheseProgramsAreInstalled([ 'irfanview', 'snagit 11 editor', 'gimp', 'microsoft clip organizer', 'paint.net', 'photoscape', 'portrait professional', 'serif photoplus', 'tineye', 'xnview', 'image analyzer' ]); end; end. Bitte schickt mir auch die Suchstrings der Grafikprogramme, die bei euch installiert sind und die nicht in der Liste aufgezählt sind, damit ich bei möglichst vielen Endbenutzern prüfen kann, welche Grafikprogramme installiert sind. Danke! |
AW: Liste der Exe-Pfade aller installierten Programme
Kein Fehler, aber eine Vergesslichkeit, die auch ich immer wieder gerne mache
Delphi-Quellcode:
rgPrograms ist ein dynamischer Array, somit ist Low() eigentlich immer 0.
for i := Low(rgPrograms) to High(rgPrograms) do
... Zu der Routine. Ein anderer Ansatz den ich mal versuchte, war die installierten Programme zu einem Gebiet (also z. B. Grafik, Video, Sound, ...) über die Registry zu ermitteln. Um bei Grafikprogrammen zu bleiben, habe ich alle Endungen zu einem Gebiet (bmp, jpg, jpeg, gif, png, ...) aufgelistet und alle damit verbundenen Programme ermittelt. Zuerst über die Verknüpfung zu der Dateiendung. Da aber nicht unbedingt jedes Programm eine Verknüpfung zu einer Dateiendung besitzt, habe ich das mit der Liste der Programme komplettiert, die schon mal eine Datei mit einer der Dateiendungen geöffnet haben (Windows merkt sich solche Programme und vermerkt sie in der Registry). Die Liste war eigentlich sehr gut und hat sogar Programme gelistet an die man selbst nicht dachte. |
AW: Liste der Exe-Pfade aller installierten Programme
Zitat:
Nur anzeigen tut es z.B. das Program ![]() |
AW: Liste der Exe-Pfade aller installierten Programme
Zitat:
Dem Laufzeitverhalten des Programms nach durchsucht es die Programmverzeichnisse und braucht dafür mehrer Minuten. Das dauert für meinen Zweck viel zu lange. Mein obiger Code erfüllt seinen Zweck in einer Zehntelsekunde! Außerdem macht das Nirsoft-Programm ganz was anderes und listet nicht die Pfade der ausführbaren Programm-Exe-Dateien auf, sondern nur die Installationsinformationen. Mein Code prüft, ob eine Reihe von Programmen installiert sind und liefert deren Exe-Pfade. |
AW: Liste der Exe-Pfade aller installierten Programme
Zitat:
Die richtige Bezeichnung lautet in diesem Fall "Open Array" und nicht "Dynamic Array". Einem dynamischen Array muss immer erst explizit mit SetLength Speicher zugewiesen werden. Im Falle eines offenen Arrays wird dies implizit durch den "Open Array Constructor" beim Aufruf erledigt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:29 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-2025 by Thomas Breitkreuz