For-Schleife in unendlich schleife :/

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ThePlexian.

    For-Schleife in unendlich schleife :/

    Ich versuche per For-Schleife Infos aller Installierte Programme unter folgender registrypfad: "Local_Machine\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" in eine listview aufzulisten.
    Ich weiß es geht alles viel einfacher ohne diese unnötigen umwege, aber ich kann leider aufgrund meines Projektes keine einfache methoden verwenden. Am ende darf ich nix anderes als Strings in die listview adden. Keine String Array, list of string oder sonstiges, nur String weshalb ich auch String.Builder benutze.

    Hier ist mein Fortschritt:

    VB.NET-Quellcode

    1. Public NameCount As Integer
    2. Public PublisherCount As Integer
    3. Public InstallCount As Integer
    4. Public VersionCount As Integer
    5. Public UninstallCount As Integer
    6. Function GetSoftwareNames()
    7. Dim DestKey As String = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
    8. Dim iList As New List(Of String)
    9. For Each App As String In Registry.LocalMachine.OpenSubKey(DestKey).GetSubKeyNames
    10. iList.Add(Registry.LocalMachine.OpenSubKey(DestKey & App & "\").GetValue("DisplayName"))
    11. NameCount = iList.Count
    12. Next
    13. Return iList
    14. End Function
    15. Function GetSoftwarePublisher()
    16. Dim DestKey As String = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
    17. Dim iList As New List(Of String)
    18. For Each App As String In Registry.LocalMachine.OpenSubKey(DestKey).GetSubKeyNames
    19. iList.Add(Registry.LocalMachine.OpenSubKey(DestKey & App & "\").GetValue("Publisher"))
    20. PublisherCount = iList.Count
    21. Next
    22. Return iList
    23. End Function
    24. Function GetSoftwareInstall()
    25. Dim DestKey As String = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
    26. Dim iList As New List(Of String)
    27. For Each App As String In Registry.LocalMachine.OpenSubKey(DestKey).GetSubKeyNames
    28. iList.Add(Registry.LocalMachine.OpenSubKey(DestKey & App & "\").GetValue("InstallDate"))
    29. InstallCount = iList.Count
    30. Next
    31. Return iList
    32. End Function
    33. Function GetSoftwareVersion()
    34. Dim DestKey As String = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
    35. Dim iList As New List(Of String)
    36. For Each App As String In Registry.LocalMachine.OpenSubKey(DestKey).GetSubKeyNames
    37. iList.Add(Registry.LocalMachine.OpenSubKey(DestKey & App & "\").GetValue("DisplayVersion"))
    38. VersionCount = iList.Count
    39. Next
    40. Return iList
    41. End Function
    42. Function GetSoftwareUninstall()
    43. Dim DestKey As String = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
    44. Dim iList As New List(Of String)
    45. For Each App As String In Registry.LocalMachine.OpenSubKey(DestKey).GetSubKeyNames
    46. iList.Add(Registry.LocalMachine.OpenSubKey(DestKey & App & "\").GetValue("UninstallString"))
    47. UninstallCount = iList.Count
    48. Next
    49. Return iList
    50. End Function
    51. Private Sub reload()
    52. Dim NameVals As List(Of String) = GetSoftwareNames()
    53. Dim PublisherVals As List(Of String) = GetSoftwarePublisher()
    54. Dim InstallVals As List(Of String) = GetSoftwareInstall()
    55. Dim VersionVals As List(Of String) = GetSoftwareVersion()
    56. Dim UninstallVals As List(Of String) = GetSoftwareUninstall()
    57. Dim BuilderName As StringBuilder = New StringBuilder()
    58. Dim BuilderPublisher As StringBuilder = New StringBuilder()
    59. Dim BuilderInstall As StringBuilder = New StringBuilder()
    60. Dim BuilderVersion As StringBuilder = New StringBuilder()
    61. Dim BuilderUninstall As StringBuilder = New StringBuilder()
    62. For Each ValName As String In NameVals
    63. BuilderName.Append(ValName).Append("<")
    64. Next
    65. For Each ValPublisher As String In PublisherVals
    66. BuilderPublisher.Append(ValPublisher).Append("<")
    67. Next
    68. For Each ValInstall As String In InstallVals
    69. BuilderInstall.Append(ValInstall).Append("<")
    70. Next
    71. For Each ValVersion As String In VersionVals
    72. BuilderVersion.Append(ValVersion).Append("<")
    73. Next
    74. For Each ValUninstall As String In UninstallVals
    75. BuilderUninstall.Append(ValUninstall).Append("<")
    76. Next
    77. Dim SoftwareName = BuilderName.ToString()
    78. Dim SoftwarePublisher = BuilderPublisher.ToString()
    79. Dim SoftwareInstall = BuilderInstall.ToString()
    80. Dim SoftwareVersion = BuilderVersion.ToString()
    81. Dim SoftwareUninstall = BuilderUninstall.ToString()
    82. Dim xName As String() = SoftwareName.Split("<")
    83. Dim xPublisher As String() = SoftwarePublisher.Split("<")
    84. Dim xInstall As String() = SoftwareInstall.Split("<")
    85. Dim xVersion As String() = SoftwareVersion.Split("<")
    86. Dim xUninstall As String() = SoftwareUninstall.Split("<")
    87. For i As Integer = 0 To NameCount - 1
    88. For ip As Integer = 0 To PublisherCount - 1
    89. For iI As Integer = 0 To InstallCount - 1
    90. For iV As Integer = 0 To VersionCount - 1
    91. For iU As Integer = 0 To UninstallCount - 1
    92. With ListView1.Items.Add(xName(i))
    93. Application.DoEvents()
    94. .SubItems.Add(xPublisher(ip))
    95. Application.DoEvents()
    96. .SubItems.Add(xInstall(iI))
    97. Application.DoEvents()
    98. .SubItems.Add(xVersion(iV))
    99. Application.DoEvents()
    100. .SubItems.Add(xUninstall(iU))
    101. End With
    102. Next
    103. Next
    104. Next
    105. Next
    106. Next
    107. End Sub


    Ich habe die "Application:DoEvents()" hinzugefügt damit es nicht crasht und man nachverfolgen kann wo es stecken bleibt.
    In dem Fall ist es in einer Unendlichschleife drin & fügt die items auch nicht korrekt hinzu. Wenn man nur eine For-Schleife ausführt funktionierts perfekt, nur macht es probleme bei mehreren gleichzeitig...

    Ich schaff es nicht die Fehler zu beheben :(
    Hoffe mir kann jmnd helfen, danke.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „SEX“ ()

    also abgesehen davon, dass es total irre ist Schleifen so zu verschachteln, würd ich mir vorher NameCount, InstallCount etc. anzeigen lassen um zu sehen, ob auch plausible Werte drinne stehn.
    Dann würd ich anstatt nur next next i, next iI, next iV etc. eintragen, damit da nichts durcheinander kommt.
    Option strict = on

    If it's stupid and it works it ain't stupid.

    Nils_Kr schrieb:

    also abgesehen davon, dass es total irre ist Schleifen so zu verschachteln, würd ich mir vorher NameCount, InstallCount etc. anzeigen lassen um zu sehen, ob auch plausible Werte drinne stehn.
    Dann würd ich anstatt nur next next i, next iI, next iV etc. eintragen, damit da nichts durcheinander kommt.

    Hab alle counts bereits per msgbox geprüft und bei allen kommt exakt 424 raus.
    Was meinst du mit "Dann würd ich anstatt nur next next i, next iI, next iV etc. eintragen, damit da nichts durcheinander kommt.", könntest du einen kleinen Beispiel zeigen?
    thx
    Dann ist es doch erstmal wichtig zu wissen, ob es tatsächlich eine Endlosschleife ist, oder ob die 13mio Durchläufe einfach solange dauern,
    dass du davon ausgehst, dass es sich um eine Endlosschleife handelt. Weil je nachdem hast du entweder einen Programmierfehler, oder
    aber dein Programmaufbau ist einfach falsch. Ich geh hier von zweitem aus, weil wozu soll man 13mio Durchläufe brauchen?

    Was ich mit next i meine wäre das hier:

    VB.NET-Quellcode

    1. for i = 0 to 10
    2. ....
    3. next i
    Wobei das hier wahrscheinlich nicht das Problem ist. Ich vesteh auch nicht so ganz, was du genau damit bezweckst,
    aber wäre es nicht sinnvoller die Schleifen einfach nacheinander durchlaufen zu lassen?
    Option strict = on

    If it's stupid and it works it ain't stupid.

    Nils_Kr schrieb:

    Dann ist es doch erstmal wichtig zu wissen, ob es tatsächlich eine Endlosschleife ist, oder ob die 13mio Durchläufe einfach solange dauern,
    dass du davon ausgehst, dass es sich um eine Endlosschleife handelt. Weil je nachdem hast du entweder einen Programmierfehler, oder
    aber dein Programmaufbau ist einfach falsch. Ich geh hier von zweitem aus, weil wozu soll man 13mio Durchläufe brauchen?

    Was ich mit next i meine wäre das hier:

    VB.NET-Quellcode

    1. for i = 0 to 10
    2. ....
    3. next i
    Wobei das hier wahrscheinlich nicht das Problem ist. Ich vesteh auch nicht so ganz, was du genau damit bezweckst,
    aber wäre es nicht sinnvoller die Schleifen einfach nacheinander durchlaufen zu lassen?


    Ohje da hab ich in der tat zu kompliziert gecodet... Okay habs nun hingekriegt indem ich die schleifen einzelnd laufen ließ.
    Vielen Dank nochmal für deine Hilfe!

    Mfg
    Warum soll jedes Item (der Name) in der ListView, alle Eigenschaften zigfach bekommen ? Was soll das?
    Sorry, aber sind die Variablen nicht alle gleich ? Also haben den gleichen WErt ?

    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais