Autor |
Beitrag |
hibbert
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: 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
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: 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
|
Verfasst: Fr 25.10.02 20:16
Übrigens auch die, die man in der Systemsteuerung nicht sieht!
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Sa 26.10.02 13:53
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: So 27.10.02 19:33
Mein 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
|
Verfasst: 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:
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.
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 -  schon wieder ein Tipp ...
Jeden so erhaltenen Unterschlüssel öffnest du, und du prüfst ob er die Values
Quelltext 1: 2:
| DisplayName UninstallString |
oder (für die geheime Software  )
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 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Mo 28.10.02 16:30
danke, aber ich bin wohl ein zu dummer schüler !
ich weiß einfach nicht weiter !
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var reg: TRegistry; begin reg := TRegistry.Create(KEY_READ); if(reg.OpenKey('HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall',false)) then exit; reg.GetKeyNames(???); |
hibbert
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
DeCodeGuru
      
Beiträge: 1333
Erhaltene Danke: 1
Arch Linux
Eclipse
|
Verfasst: Mo 28.10.02 16:47
guckst du in hilfe
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
|
Verfasst: Mo 28.10.02 17:59
Zu dem was DeCodeGuru gesagt hat, noch diese Ergänzung:
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.
Delphi-Quelltext 1: 2: 3: 4:
| if(reg.OpenKey('...',false)) then begin end; |
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: 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 !!!
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
|
Verfasst: Mi 20.11.02 23:14
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 21.11.02 09:12
Oder:
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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| if(reg.OpenKey('...',false)) then begin if(reg.ValueExists('DisplayName')) then Listbox1.Items.Add(reg.ReadString('DisplayName') else if(reg.ValueExists('QuietDisplayName')) then Listbox1.Items.Add(reg.ReadString('QuietDisplayName');
end; |
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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.
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
|
Verfasst: 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.)
<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 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Fr 22.11.02 18:02
Danke !!!
ach Luckie nur für dich :
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
|
Verfasst: 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. 
|
|