Rubrik: System/Windows · Sonstiges | VB-Versionen: VB6 | 02.07.01 |
Deinstallierbare Software ermitteln Dieser Tipp zeigt, wie man die Anwendungen ermitteln kann, für die ein Deinstaller existiert. | ||
Autor: Dieter Otter | Bewertung: | Views: 20.708 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Um in Ihrer Anwendung zu ermitteln, welche Software auf dem System alles installiert ist, kann man die Windows-Registry auslesen - und zwar den Bereich, in dem die Aufrufe für die einzelnen Deinstallationsprogramme gespeichert sind.
Die Einträge der deinstallierbaren Software sind hierbei im Abschnitt HKEY_LOCAL_MACHINE\Software\MicrosoftWindows\CurrentVersion\Uninstall gespeichert.
Also müssen Sie diesen Abschnitt "auslesen", und zwar am einfachsten mit Hilfe des Tipps Durchsuchen der Registry. Als Suchtext geben Sie dann das Schlüsselwort UninstallString an. Alle gefundenen Einträge speichern Sie in einem ListView-Control, für welches Sie zwei sichtbare Spalten erstellen: Anwendung und CommandLine. Letztere zeigt den Aufrufstring für das Deinstalltionsprogramm...
' Liste der deinstallierbaren Software Private Sub ListeRefresh() Dim SO As SearchOptions Dim Gefunden() As String Dim I As Integer Dim Daten() As String Dim DisplayName As String Dim RegKey As String Dim Folder As String Dim itemX As ListItem RegKey = "Software\Microsoft\Windows\" & _ "CurrentVersion\Uninstall" With ListView1 .ListItems.Clear ' vb@rchiv-Tipp ' Durchsuchen der Registry wird benötigt! ' Alle Einträge im Schlüssel ' Software\Microsoft\Windows\CurrentVersion\Uninstall ' ermitteln With SO .HowToSearch = StringExists .SearchMainKey = HKEY_LOCAL_MACHINE .SearchString = "UninstallString" .StartSearchPath = RegKey .SearchSubfolders = True .FindKeys = False .FindValueNames = True .FindValues = False End With ' Suche starten FindString SO, Gefunden On Error Resume Next For I = 0 To UBound(Gefunden) Daten = Split(Gefunden(I), vbCrLf) ' SubKey Folder = Mid$(Daten(0), InStrRev(Daten(0), "\") + 1) ' DisplayName ermitteln DisplayName = Get_ValueString(HKEY_LOCAL_MACHINE, _ RegKey & "\" & Daten(1), "DisplayName") If DisplayName = "" Then DisplayName = Folder Set itemX = .ListItems.Add(, Daten(0), DisplayName) itemX.SubItems(1) = Daten(2) Next I End With End Sub
In unserem Beispiel möchten wir eine Liste aller deinstallierbaren Anwendungen ermitteln, mit folgenden zwei Möglichkeiten:
- Aufruf des Deinstallers aus der Liste heraus, Warten bis Deinstallation beendet, dann Liste aktualisieren
- Löschen des Eintrags aus der Registrier-Datenbank, ohne die Anwendung zu deinstallieren (z.B. sinnvoll, wenn doppelte Einträge in der Registry gespeichert stehen)
Plazieren wir also noch zwei Commandbuttons unterhalb des ListView-Elements: cmdDeinstall und cmdDelete
Deinstaller aufrufen
' Anwendung deinstallieren Private Sub cmdDeinstall_Click() Dim CmdLine As String Dim Index As Integer If MsgBox("Es wird jetzt das Deinstallations-" & _ "Programm gestartet!", 65, "Deinstallieren") = vbOK Then ' Deinstallation aufrufen With ListView1 CmdLine = .SelectedItem.SubItems(1) If AppStartAndWait(CmdLine, vbNormalFocus) Then ' Liste aktualisieren Index = .SelectedItem.Index ListeRefresh ' nächsten Eintrag markieren If Index > .ListItems.Count Then _ Index = .ListItems.Count If Index > 0 Then Set .SelectedItem = .ListItems(Index) .SelectedItem.EnsureVisible End If Else ' Fehler aufgetreten MsgBox "Fehler beim Starten des Deinstallers", _ 16, "Deinstallieren" End If End With End If End Sub
Wenn Sie sich den Code aufmerksam angeschaut haben, dann haben Sie sicherlich auch bemerkt, daß hier eine Funktion verwendet wird, die es in VB doch gar nicht gibt: AppStartAndWait
Hierbei handelt es sich um einen früheren Tipp aus dem vb@rchiv, der genau unseren Vorstellungen entspricht: Starten einer Anwendungen und warten bis diese beendet wurde.
Eintrag aus der Registry löschen
Um einen Eintrag aus der Registrierdatenbank zu löschen, ohne die Anwendung selbst deinstallieren zu müssen, verwenden wir einfach die API-Funktion RegDeleteKey:
Private Declare Function RegDeleteKey Lib "advapi32.dll" _ Alias "RegDeleteKeyA" ( _ ByVal hKey As Long, _ ByVal lpSubKey As String) As Long
' Eintrag aus Registrierdatenbank löschen Private Sub cmdDelete_Click() Dim lRet As Long Dim SubKey As String Dim Index As Integer If MsgBox("Aktuellen Eintrag wirklich aus der " & _ "Registry löschen?", 292, "Löschen") = vbYes Then With ListView1 SubKey = .SelectedItem.Key lRet = RegDeleteKey(MainKey.HKEY_LOCAL_MACHINE, _ SubKey) If lRet = 0 Then ' Liste aktualisieren Index = .SelectedItem.Index ListeRefresh ' nächsten Eintrag markieren If Index > .ListItems.Count Then _ Index = .ListItems.Count If Index > 0 Then Set .SelectedItem = .ListItems(Index) .SelectedItem.EnsureVisible End If Else ' Fehler aufgetreten MsgBox "Fehler beim Löschen des Eintrags!", _ 16, "Löschen" End If End With End If End Sub