Entwickler-Ecke
Windows API - Installierte Software auslesen
hibbert - Fr 25.10.02 16:53
Titel: Installierte Software auslesen
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 - Fr 25.10.02 18:45
Im Registry Key
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
findest du alle Programme, die du in Systemsteuerung/Software auch siehst.
Delete - Fr 25.10.02 19:16
Übrigens auch die, die man in der Systemsteuerung nicht sieht!
hibbert - Sa 26.10.02 12:53
Danke !!!
mfg hibbert
hibbert - So 27.10.02 18: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 ???
Delete - So 27.10.02 18: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. :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
Quelltext
1: 2:
| DisplayName UninstallString |
oder (für die geheime Software 8))
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 - Mo 28.10.02 15: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
DeCodeGuru - Mo 28.10.02 15: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.
Delete - Mo 28.10.02 16: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 - Mi 20.11.02 21: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
Delete - Mi 20.11.02 22:14
Also bei den Smilies, die du gewählt hast, könnte einem fast die Lust vergehen dir zu helfen :evil: .
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
Narses: Code- durch Delphi-Tags ersetzt
Delete - Do 21.11.02 08: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
Delete - Do 21.11.02 09: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.
Delete - Do 21.11.02 11: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 - Fr 22.11.02 17: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
Delete - Fr 22.11.02 19: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:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!