AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Liste der Exe-Pfade aller installierten Programme
Thema durchsuchen
Ansicht
Themen-Optionen

Liste der Exe-Pfade aller installierten Programme

Ein Thema von PeterPanino · begonnen am 3. Jan 2013 · letzter Beitrag vom 6. Jan 2013
Antwort Antwort
PeterPanino

Registriert seit: 4. Sep 2004
1.472 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Liste der Exe-Pfade aller installierten Programme

  Alt 4. Jan 2013, 18:25
Das schriebst du bereits, aber schlauer bin ich weiterhin nicht.
Kann ich leider nichts dafür.

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!
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.472 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Liste der Exe-Pfade aller installierten Programme

  Alt 4. Jan 2013, 23:55
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!
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

AW: Liste der Exe-Pfade aller installierten Programme

  Alt 5. Jan 2013, 01:40
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.
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.472 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Liste der Exe-Pfade aller installierten Programme

  Alt 5. Jan 2013, 13:05
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.660 Beiträge
 
Delphi 12 Athens
 
#5

AW: Liste der Exe-Pfade aller installierten Programme

  Alt 6. Jan 2013, 18:38
Du prüfst aber nicht, ob die Programme installiert sind, sondern ob es eine Verknüpfung im Startmenü darauf gibt. Wie ich bereits angedeutet habe gibt es aber auch Setups, die optional anbieten, diese Verknüpfung nicht anzulegen. Aber Du musst selbst wissen, ob Du damit leben kannst, eine 100% saubere Lösung kenne ich auch nicht, dafür gibt es einfach zu viele Unwägbarkeiten bei der Problemstellung.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.684 Beiträge
 
Delphi 5 Professional
 
#6

AW: Liste der Exe-Pfade aller installierten Programme

  Alt 6. Jan 2013, 20:28
Ich sehe immer noch nicht, wo jetzt Hilfsprogramme oder ähnliche Geschichten rausgefiltert werden. Das einzige, was da "gefiltert" wird, sind die Uninstaller, die aber so heißen müssen (oder den String enthalten, so genau hab ich mir das nicht angesehen).

Nunja, wie bereits zu Anfang des Themas festgestellt, ist das nicht so simpel lösbar. Davon abgesehen wüsste ich auch nicht, wofür man eine solche Liste braucht, aber das liegt sicher an mangelnder Phantasie meinerseits .

MfG Dalai
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:15 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