Autor Beitrag
hibbert
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: Fr 25.10.02 17:53 
hallo,
ich habe dieses Thema mal irgendwann hier im Forum gelesen, hab es jetzt aber nicht wieder finden können ! :(
also, wie kann ich eine liste der bereits installierten software erstellen ?

DANKE !!
mfg Hibbert
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Fr 25.10.02 19:45 
Im Registry Key
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
findest du alle Programme, die du in Systemsteuerung/Software auch siehst.

_________________
Ist Zeit wirklich Geld?
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 25.10.02 20:16 
Übrigens auch die, die man in der Systemsteuerung nicht sieht!
hibbert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: Sa 26.10.02 13:53 
Danke !!!

mfg hibbert
hibbert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: So 27.10.02 19:33 
Mein
Zitat:
Danke !!!
war ein bisschen voreilig. ich hab mich so gefreut, endlich den code zu haben, ohne genau zu wissen, wie ich ihn anwenden kann.
alse, jetzt hab ich den code, aber wie kann ich eine liste erstellen? so dass z.b. alle installierten softwares* in einer listbox aufgelistet werden.
wäre cool, wenn mir jemand weiter helefn könnte !
mfg hibbert

* was ist eigentlich die mehrzahl von software ? softwares ???
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 27.10.02 19:51 
Ich mach´s mal ohne Quellcode. Dann ist dein Erfolgserlebnis größer.
Also:

Du kennst den Schlüssel, in dem sich die Liste der installierten Software versteckt. Diesen Schlüssel öffnest du (am besten nur lesend, wg. der Rechte unter NT) ohne ihn zu erzeugen. Na gut, dafür gibt´s den Code:
ausblenden Quelltext
1:
2:
3:
reg := TRegistry.Create(KEY_READ); // <-- aha! #1
{ ... }
if(reg.OpenKey('...',FALSE)) then // <-- aha! #2

Zum einen willst du die Software ja nur in der Liste darstellen, dazu brauchst du also lediglich Leserechte - und das hat wiederrum den Vorteil, dass es auch unter NT, 2000, XP mit eingeschränkten Benutzerrechten klappt.
Zum anderen ist es witzlos, den Schlüssel mit "TRUE" notfalls zu erzeugen - dann steht trotzdem nichts drin. :wink:

So, jetzt bist du in dem Schlüssel und liest die Namen aller untergeordneten Schlüssel aus. Tipp: Dafür gibt´s eine Funktion, die man im schlechten Deutsch als "Bekomme Schlüsselnamen" übersetzen könnte (s. Hilfe). Du bekommst die Ergebnisse als Stringliste - :roll: schon wieder ein Tipp ...

Jeden so erhaltenen Unterschlüssel öffnest du, und du prüfst ob er die Values
ausblenden Quelltext
1:
2:
DisplayName
UninstallString

oder (für die geheime Software 8))
ausblenden Quelltext
1:
2:
QuietDisplayname
QuietUninstallString

enthält. Notwendig ist das nicht. Du kannst auch alle gefundenen Schlüssel auflesen. Aber manche internen Komponenten (vom IE, bspw.) besitzen zwar einen Namen aber nichts zum Deinstallieren. Oder umgekehrt ...

Tja, wenn die String-Values "Displayname" oder "QuietDisplayname" vorhanden sind, stellst du sie in der Listbox dar - sie entsprechen den Namen, die du auch in der Systemsteuerung siehst ... bzw. nicht siehst (auf "QuietDisplayname" bezogen).
Wenn es keinen Namen gibt, dann schreibst du z.B. den Schlüsselnamen selbst in die Listbox.

Wenn du alles aufgelistet hast, machst du die Registry wieder schön zu.

Und das war´s.
hibbert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: Mo 28.10.02 16:30 
danke, aber ich bin wohl ein zu dummer schüler !
ich weiß einfach nicht weiter !
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var reg: TRegistry;
begin
reg := TRegistry.Create(KEY_READ); // <-- aha! #1
{ ... }
if(reg.OpenKey('HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall',false)) then
exit;
reg.GetKeyNames(???);

hibbert

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt

_________________
I kunnen väl svara endast ja eller nej
Om i viljen eller nej
DeCodeGuru
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1333
Erhaltene Danke: 1

Arch Linux
Eclipse
BeitragVerfasst: Mo 28.10.02 16:47 
guckst du in hilfe :wink:

Zitat:
Die Methode gibt eine String-Liste mit den Namen aller Unterschlüssel zurück, die zum aktuellen Schlüssel gehören.

procedure GetKeyNames(Strings: TStrings);

Beschreibung

Mit GetKeyNames ermitteln Sie die Namen aller Unterschlüssel, die dem aktuellen Schlüssel zugeordnet sind. Diese Informationen sind erforderlich, wenn in einer Anwendung über eine Reihe von Schlüsseln iteriert werden soll.

Die Variable Strings besitzt den Typ TStrings und nimmt die Liste mit den Namen der Unterschlüssel auf.


Wie man sieht, muss man eine Variabel vom Typ TStrings übergeben. Also kannste ne Variable vom Type TStringlist nehmen, die Initialisieren und die daten einlesen.

_________________
Viele Grüße
Jakob
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 28.10.02 17:59 
Zu dem was DeCodeGuru gesagt hat, noch diese Ergänzung:
ausblenden Delphi-Quelltext
1:
if(reg.OpenKey('...',false)) then exit;					

Das wird so nichts!
Das false sagt aus, dass der Schlüssel nicht erzeugt werden soll, wenn er nicht existiert. (Das meinte ich mit witzlos.) Wenn er existiert, dann wird er geöffnet - die Funktion liefert TRUE zurück und springt -dank "exit"- raus.

Korrekt wäre also bspw.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
if(reg.OpenKey('...',false)) then
  begin
    // Schlüsselnamen auslesen, usw.
  end;


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
hibbert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: Mi 20.11.02 22:42 
so, ich habe das jetzt lange genug ausprobiert, bin aber zu keinem ergebnis gekommen.
ich weiß einfach nicht mehr weiter !!! :evil: :cry:
kann mich endlich einer erlösen, und mir mal einen quellcode geben, wo die installierte software in einer listbox aufgelistet ist??
wäre echt nett !!
mfg hibbert

_________________
I kunnen väl svara endast ja eller nej
Om i viljen eller nej
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 20.11.02 23:14 
Also bei den Smilies, die du gewählt hast, könnte einem fast die Lust vergehen dir zu helfen :evil: .

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
 
procedure TForm1.Button1Click(Sender: TObject);
var
  reg: TRegistry;
  bResult: Boolean;
begin
  reg := TRegistry.Create(KEY_READ);
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    bResult := reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Uninstall',false);
    if bResult = FALSE then
    begin
      reg.Free;
      exit;
    end;
    reg.GetKeyNames(Listbox1.Items);
  finally
    reg.Free;
  end;
end;


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 21.11.02 09:12 
Oder:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
if(reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Uninstall',false)) then
  begin
    reg.GetKeyNames(Listbox1.Items);
    reg.CloseKey;
  end;

(ohne "bResult"-Variable).

Ich würde allerdings die Anzeige der Schlüsselnamen in der Listbox vom Vorhandensein der REG_SZ-Werte "DisplayName" und "UninstallString", bzw. "QuietDisplayName" und "QuietUninstallString" abhängig machen.
Es gibt nämlich -jedenfalls bei mir!- ein oder zwei Schlüssel, die gar nichts enthalten. Warum die angelegt wurden, keine Ahnung ... mal Microsoft fragen ...

Außerdem zeigt dieser Weg nur die Schlüsselnamen an. Das könnte bei vorhandener MSI-Software zu Verwirrungen führen, da man dann die GUID der Installation sieht. Als Ergänzung also:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
if(reg.OpenKey('...',false)) then
  begin
    // Software ist sichtbar
    if(reg.ValueExists('DisplayName')) then
      Listbox1.Items.Add(reg.ReadString('DisplayName')
    // Software ist nicht sichtbar
    else if(reg.ValueExists('QuietDisplayName')) then
      Listbox1.Items.Add(reg.ReadString('QuietDisplayName');

    // ggf. noch "UninstallString" bzw. "QuietUninstallString"
    // für eine evtl. Deinstallation lesen und anzeigen

    { ... }
  end;


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 21.11.02 10:41 
Hallo Mathias,
bResult habe ich gebraucht, weil aus irgendeinem Grund die Listbox immer leer geblieben ist und ich das ganze debuggen wollte. Irgendwann ging es dann, keien Ahnung, was ich da geändert hatte. Außerdem ist es so übersichtlicher. :wink:

Und der Rest, na ja: erstens hab eicjh daran gar nicht gedacht und zweitens das ganze verfeinern sollte er dann schon selber.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 21.11.02 12:00 
Dass du die Variable bResult irgendwie benötigt hast, dachte ich mir schon. Ist ja auch nicht schlimm.

Die Ergänzung war für hibbert gedacht - dass er sein Programm verfeinern muss, versteht sich ja von selbst. Ich wollte nur vorbeugen, damit nicht die Frage kommt: "Häh, was sind ´n das für Einträge? Wo steht ´n jetzt mein Word?" (Anm.: "Word" wahlweise durch ein anderes Programm ersetzen.)
:wink:


<Edit>

Funktioniert hätte es sowieso nicht, da ich ja nur den Hauptschlüssel geöffnet habe. Also, hibbert - du musst in jedem Fall die vorhandenen Schlüsselnamen herausfinden (wie, weißt du ja nun), jeden dieser Schlüssel öffnen und nach den von mir genannten Einträgen suchen.
Dann enthält deine Listbox die Werte, die du aus der Systemsteuerung/Software kennst.

</Edit>
hibbert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: Fr 22.11.02 18:02 
Danke !!!
ach Luckie nur für dich : :D :D :D :D :D :D :D :D :D :D :D
doch noch 2 weitere fragen:
1. wie kann ich den inhalt eines strings in der registry auslesen?
(z.b: vom key
HKEY_LOCAL_MACHINE \Software\microsoft\windows\currentversion\run
den inhalt vom string Test auslesen)
2.wenn ich mir jetzt die liste ansehe, steht ganz am ende folgendes:
{FF895069-BD9A-11D5-986D-00500443CF9F}
kann man das irgendwie ausblenden ???
mfg hibbert

_________________
I kunnen väl svara endast ja eller nej
Om i viljen eller nej
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 22.11.02 20:40 
hibbert hat folgendes geschrieben:
1. wie kann ich den inhalt eines strings in der registry auslesen?

Stichwort ReadString. Die Delphi-Hilfe findest du sicher allein?!

Zitat:
wenn ich mir jetzt die liste ansehe, steht ganz am ende folgendes:
{FF895069-BD9A-11D5-986D-00500443CF9F}
kann man das irgendwie ausblenden ???

Was hast du denn nun zum Aufbau der Liste benutzt? Nur "GetKeyNames", oder hast du jeden einzelnen Schlüssel geöffnet und den Displaynamen ausgelesen?

Wenn du dir nur die Schlüsselnamen anzeigen lässt, dann dürfte diese GUID darauf hindeuten, dass du Office, bzw. irgendeine andere Software installiert hast, die den MSI benutzt. Aber das schrieb ich schon:
MathiasSimmack hat folgendes geschrieben:
Außerdem zeigt dieser Weg nur die Schlüsselnamen an. Das könnte bei vorhandener MSI-Software zu Verwirrungen führen, da man dann die GUID der Installation sieht.

Siehste, Luckie, ich wollte präventiv arbeiten ... hat nix genutzt. :evil: