Problemen met ListView

Status
Niet open voor verdere reacties.

joke1

Gebruiker
Lid geworden
24 mei 2006
Berichten
159
Ik ben een lijst aan 't maken van de geïnstalleerde programma's. Het werkt niet.
Deze code geeft helemaal niks terug.

Dit is mijn code:
Code:
    Dim Software As String = Nothing
            Dim SoftwareKey As String = "SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products"
            Using rk As RegistryKey = Registry.LocalMachine.OpenSubKey(SoftwareKey)
                For Each skName In rk.GetSubKeyNames
                    'Get sub keys
                    Dim name = Registry.LocalMachine.OpenSubKey(SoftwareKey).OpenSubKey(skName).OpenSubKey("InstallProperties").GetValue("DisplayName")
                    Dim installocation = Registry.LocalMachine.OpenSubKey(SoftwareKey).OpenSubKey(skName).OpenSubKey("InstallProperties").GetValue("InstallLocation")
                    Dim publisher = Registry.LocalMachine.OpenSubKey(SoftwareKey).OpenSubKey(skName).OpenSubKey("InstallProperties").GetValue("Publisher")
                    Dim uninstallString = Registry.LocalMachine.OpenSubKey(SoftwareKey).OpenSubKey(skName).OpenSubKey("InstallProperties").GetValue("UninstallString")
                    If name.ToString <> "" Then
                        Dim list As New ListViewItem
                        list.Text = name.ToString
                        list.SubItems.Add(installocation.ToString)
                        list.SubItems.Add(publisher.ToString)
                        ListView1.Items.Add(list)
                    End If
                Next
            End Using

Graag wat hulp aub
 
Laatst bewerkt:
Heb je je code al gedebugged, even wat breakpoints zetten op plaatsen waar je denk dat hij faalt?

- misschien is 'rk.GetSubKeyNames' leeg zodat je foreach loop door 0 items heen gaat en dus niets doet
- je hebt een 'if' zonder else dus misschien is de 'if' nooit true (if zonder else is prima zolang je weet dat hij goed werkt)

Als debuggen niet goed werkt gebruik bij dit soort gevallen meestal een logger zodat je kunt volgen wat je method aan het doen is. Je kunt Console.WriteLine("je bericht") gebruiken in je code, dan zal hij dit weergeven in het output window in visual studio. Je kunt dan bijvoorbeeld loggen hoeveel subkeys er zijn gevonden zodat je al kunt zien of het er 0 zouden zijn, je zou een else kunnen maken met een log 'displayname is leeg bij subkey x'

Zodra het werkt kun je de logs eruit halen of erin laten zitten als het handig is.




ook kun je dingen die hetzelfde zijn waarschijnlijk beter herschrijven zodat het ook voor jezelf een stuk duidelijker is waar mogelijke problemen zijn

Code:
Dim name = Registry.LocalMachine.OpenSubKey(SoftwareKey).OpenSubKey(skName).OpenSubKey("InstallProperties").GetValue("DisplayName")
Dim installocation = Registry.LocalMachine.OpenSubKey(SoftwareKey).OpenSubKey(skName).OpenSubKey("InstallProperties").GetValue("InstallLocation")
Dim publisher = Registry.LocalMachine.OpenSubKey(SoftwareKey).OpenSubKey(skName).OpenSubKey("InstallProperties").GetValue("Publisher")
Dim uninstallString = Registry.LocalMachine.OpenSubKey(SoftwareKey).OpenSubKey(skName).OpenSubKey("InstallProperties").GetValue("UninstallString")



Code:
Dim properties = rk.OpenSubKey(skName).OpenSubKey("InstallProperties")

Dim displayName = properties.GetValue("DisplayName")
Dim installLocation = properties.GetValue("InstallLocation")
Dim publisher = properties.GetValue("Publisher")
Dim uninstallString = properties.GetValue("UninstallString")
(niets getest)
 
Bloodshed bedankt voor je reactie.
De lijn "For Each skName In rk.GetSubKeyNames" geeft volgende error:
De objectverwijzing is niet op een exemplaar van een object ingesteld. Hoe ik dat moet oplossen weet ik niet. Kan jij me verder helpen?
 
Ik denk dat je rk NULL is (Nothing in VB.net?), klopt je registery string wel?

(bij mij is geen '\UserData' subkey in de 'SOFTWARE\Microsoft\Windows\CurrentVersion\Installer' key)
 
Ik heb Windows 10:
 

Bijlagen

  • DisplayName.png
    DisplayName.png
    56 KB · Weergaven: 63
Laatst bewerkt:
Je hebt waarschijnlijk een x64 systeem en je programma target x32, als je je programma 'platform target' op x64 target zet zal het wel lukken of als je dat niet wilt doen kun je 'Registry.LocalMachine' vervangen door 'RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)' , dat zal het wel zijn denk ik.
 
Formidabel, ik heb het vinkje bij "Prefer 32-bit" weggenomen en alles werkt. Nooit gedacht dat het zo simpel zou zijn. Bedankt Bloodshed.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan