Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Liste der Exe-Pfade aller installierten Programme (https://www.delphipraxis.net/172442-liste-der-exe-pfade-aller-installierten-programme.html)

PeterPanino 4. Jan 2013 16:41

AW: Liste der Exe-Pfade aller installierten Programme
 
Zitat:

Zitat von dunningkruger (Beitrag 1197623)
Das mit "(welche durch keine Regel definiert ist)" wird interessant...

Eine Menge von Objekten, die durch keine Regel definiert ist, könnte z.B. sein: Auto, Apfel, Intelligenz, Geduld, Universum, ...

Zitat:

Zitat von dunningkruger (Beitrag 1197623)
In #2 hat Popov schon einen brauchbaren Ansatz geliefert, der aber für alle Laufwerke mit gewissewn Ordnern...

Dauert zu lange.

DeddyH 4. Jan 2013 16:44

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?

PeterPanino 4. Jan 2013 16:53

AW: Liste der Exe-Pfade aller installierten Programme
 
Bitte keine "Hilfe" mehr. Ich habe eine Lösung und poste sie später.

Dalai 4. Jan 2013 17:58

AW: Liste der Exe-Pfade aller installierten Programme
 
Zitat:

Zitat von PeterPanino (Beitrag 1197645)
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.

Das schriebst du bereits, aber schlauer bin ich weiterhin nicht.

Zitat:

Die Art der Filterung stellt sicher, dass nur die Exes der Hauptprogramme gefunden werden.
Na da bin ich ja mal gespannt, wie und wonach du filtern willst...

MfG Dalai

PeterPanino 4. Jan 2013 18:25

AW: Liste der Exe-Pfade aller installierten Programme
 
Zitat:

Zitat von Dalai (Beitrag 1197656)
Das schriebst du bereits, aber schlauer bin ich weiterhin nicht.

Kann ich leider nichts dafür.

Zitat:

Zitat von Dalai (Beitrag 1197656)
Na da bin ich ja mal gespannt, wie und wonach du filtern willst...

Achte auf deinen Blutdruck! ;-)

Aber vielen Dank vorerst mal an alle, die mir helfen wollten! :-D

PeterPanino 4. Jan 2013 23:55

AW: Liste der Exe-Pfade aller installierten Programme
 
Hier ist der Code:
Delphi-Quellcode:
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.
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.

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!

Popov 5. Jan 2013 01:40

AW: Liste der Exe-Pfade aller installierten Programme
 
Kein Fehler, aber eine Vergesslichkeit, die auch ich immer wieder gerne mache

Delphi-Quellcode:
      for i := Low(rgPrograms) to High(rgPrograms) do
...
rgPrograms ist ein dynamischer Array, somit ist Low() eigentlich immer 0.

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.

Delphi-Laie 5. Jan 2013 12:20

AW: Liste der Exe-Pfade aller installierten Programme
 
Zitat:

Zitat von PeterPanino (Beitrag 1197542)
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:

C:\Program Files (x86)\XYProgramm\XYProgramm.exe

Nur angezeigt oder auch passenden Quelltext dazu?

Nur anzeigen tut es z.B. das Program MyUnInstaller von Nirsoft. Leider liegen keine Quelltexte bei, die wären allerdings ohnehin in C(++).

PeterPanino 5. Jan 2013 12:47

AW: Liste der Exe-Pfade aller installierten Programme
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1197730)
Nur anzeigen tut es z.B. das Program MyUnInstaller von Nirsoft. Leider liegen keine Quelltexte bei, die wären allerdings ohnehin in C(++).


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.

PeterPanino 5. Jan 2013 13:05

AW: Liste der Exe-Pfade aller installierten Programme
 
Zitat:

Zitat von Popov (Beitrag 1197717)
rgPrograms ist ein dynamischer Array, somit ist Low() eigentlich immer 0.


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:35 Uhr.
Seite 4 von 5   « Erste     234 5      

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