![]() |
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 14:28 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