none
VB.Net: Öffnen, Identifizieren, Navigieren eines externen Internet Explorers RRS feed

  • Frage

  • Mein VB.net-Programmteil öffnet einen externen Internet-Explorer und soll mit diesem repetitiv navigieren. Das Öffnen und Navigieren funktioniert einwandfrei, nicht jedoch das "Killen" nur dieses einen Explorers. Unerwünscht ist, dass beim "Killen" alle (nichtbeteiligten) Explorer-Prozesse gekillt werden. Hier der Programmauszug, der funktioniert. jedoch mit den erwähnten Mängeln.

    Gibt es eine Lösung mit direktem repetitivem Navigieren, so, dass ich nur bei Programmschluss das EXP killen muss?

    Wie gelingt die Identifikation und das Navigieren und ggf. "Killen" nur gerade dieses einen Prozesses EXP?

    Sub NAQRZ()

            Dim EXP() As Process = Process.GetProcessesByName("iexplore")

            If Not IEXPL Is Nothing Then

                KIPRO()

            End If

            IEXPL = New SHDocVw.InternetExplorer

            With IEXPL

                .Navigate("http://www.qrz.com/db/" & ADQRZ)

               

            End With

        End Sub

    Sub KIPRO()

            Dim EXP() As Process = Process.GetProcessesByName("iexplore")

            If Not EXP Is Nothing Then

                For Each SubProcess As Process In EXP

                    SubProcess.Kill()

                Next

            End If

            IEXPL = Nothing

            Thread.Sleep(50) 'Nach Schliessen kleine Pause

     End Sub

    Vielen Dank für Anregungen in einer Sache bei der ich selber nicht weiterkomme. Roland Burkhard

    Samstag, 17. November 2018 14:39

Antworten

  • Hallo Roland,

    ich verstehe das Problem aber nicht deinen Grund. Wenn ich ganz normal nur eine Instanz vom IE erzeuge, kann ich mit dem x mal navigieren, da gibt es nicht mehrere Prozesse, ...

    Hier mal ein Beispielcode:

    Public Class FormX
    
        Private Property IE      As SHDocVw.InternetExplorer
        Private Property Counter As Int32 = 0
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            If Me.IE Is Nothing Then
                Me.IE = Me.CreateNewIE()
            End If
    
            Me.IE.Navigate( $"http://www.irgendwas.tld/?counter={Me.Counter}" )
            Me.Counter += 1
    
        End Sub
    
        Private Sub Form_Closing(sender As Object, e As EventArgs) Handles Me.Closing
    
            Me.CloseIE()
    
        End Sub
    
        Private Function CreateNewIE() As SHDocVw.InternetExplorer
    
        Dim Result As New SHDocVw.InternetExplorer()
            Result.Visible = True
    
            Return Result
    
        End Function
        
        Private Sub CloseIE()
    
            Me.IE.Stop()
            Me.IE.Quit()
    
            Me.IE = Nothing
    
        End Sub
    
    End Class


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Sonntag, 18. November 2018 09:07
    Moderator
  • Hallo Roland,

    die Schreibweise $"Irgendwas{Variable}" gibt es erst in neueren C#/VB.NET Versionen bzw. auch IIRC erst ab VS 2017 und stellt eine verkürzte Fassung für String.Format dar. Falls das in deinem Fall das Problem sein sollte, kannst Du auch die klassische Schreibweise verwenden.

    Me.IE.Navigate( String.Format( "http://www.irgendwas.tld/?counter={0}", Me.Counter )

    In deinem konkreten Fall wäre das dann bspw.:

    Dim NavAddr
        NavAddr = String.Format( "http://www.qrz.com/db/{0}/", <UrlParameter> )
    
        Me.IE.Navigate( NavAddr )
    

    Mein Beispiel mit dem Zähler war nur das, was es sein sollte: Eben ein Beispiel :) Das brauchst Du an der Stelle natürlich nicht in dieser Form. Es ging mir nur darum, zu zeigen, dass es problemlos möglich ist, mit einem Tab/Fenster des IE x verschiedene Navigationen durchzuführen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Montag, 19. November 2018 11:39
    Moderator

Alle Antworten

  • Hallo Roland,

    so ganz ehrlich gesagt hab ich nicht verstanden, warum Du das "Killen" überhaupt machen willst? Was funktioniert beim "repetitiven navigieren" (was meinst Du damit überhaupt genau?) nicht, so dass Du irgendwelche Prozesse abschießen musst?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Samstag, 17. November 2018 14:53
    Moderator
  • Hi Roland,
    wenn Du die Iexplore-Instanz "abschießt", werden alle Reiter beendet. Vermutlich willst Du nur einen Reiter schließen?

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert Roland 73 Sonntag, 18. November 2018 06:54
    • Tag als Antwort aufgehoben Stefan FalzModerator Sonntag, 18. November 2018 08:40
    Samstag, 17. November 2018 18:26
  • Guten Abend Stefan. danke für die Rückfrage, ich präzisiere:

    Repetitiv navigieren, damit meine ich, dass ich hintereinander mit einem einzigenn Browser arbeiten wollte. Das ist mir trotz Suchen und Ausprobieren nicht gelungen.

    Killen darum, weil jedesmal wenn ich wieder auf eine andere Seite navigierte (anderer ADQRZ-Wert im navigate) ein neuer Browser eröffnet wurde. Das war natürlich schlecht. Deshalb die nun (für mich unbefriedigende Krücke) mit dem Killen und dem Eröffnen des neuen Browsers.

    Was ich möchte ist einfacher: Einen einzigen Browser eröffnen. Dann hintereinander auf verschiedene Seiten navigieren und beim Schliessen des Programms diesen einzigen Browser wieder schliessen oder "killen".

    Gruss Roland Burkhard

    Samstag, 17. November 2018 18:32
  • Hi Peter

    Nein, es geht nicht um die Reiter. Ich habe das noch präzisiert. Siehe meinen Eintrag zu Stefans Fragen. Gruss und Dank für Anregungen. Roland

    Sonntag, 18. November 2018 06:57
  • Hallo Roland,

    ich verstehe das Problem aber nicht deinen Grund. Wenn ich ganz normal nur eine Instanz vom IE erzeuge, kann ich mit dem x mal navigieren, da gibt es nicht mehrere Prozesse, ...

    Hier mal ein Beispielcode:

    Public Class FormX
    
        Private Property IE      As SHDocVw.InternetExplorer
        Private Property Counter As Int32 = 0
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            If Me.IE Is Nothing Then
                Me.IE = Me.CreateNewIE()
            End If
    
            Me.IE.Navigate( $"http://www.irgendwas.tld/?counter={Me.Counter}" )
            Me.Counter += 1
    
        End Sub
    
        Private Sub Form_Closing(sender As Object, e As EventArgs) Handles Me.Closing
    
            Me.CloseIE()
    
        End Sub
    
        Private Function CreateNewIE() As SHDocVw.InternetExplorer
    
        Dim Result As New SHDocVw.InternetExplorer()
            Result.Visible = True
    
            Return Result
    
        End Function
        
        Private Sub CloseIE()
    
            Me.IE.Stop()
            Me.IE.Quit()
    
            Me.IE = Nothing
    
        End Sub
    
    End Class


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Sonntag, 18. November 2018 09:07
    Moderator
  • Guten Tag Stefan

    Vielen Dank für die Lösung, die für mich vom Konzept her klar ist. Den Browser mit einer laufenden Nummer zu versehen und aufzuzählen, das wird gehen.

    Allerdings, die wichtigste Anweisung  Me.IE.Navigate( $"http://www.irgendwas.tld/?counter={Me.Counter}" ) kann ich auch nach etlichen Versuchen nicht umsetzen. Ich erhalte Fehlermeldungen oder die Zuweisung von Me.Count zum Browser geht nicht.

    Me.IE.Navigate(NavAddr/counter={Me.Counter}") oder ähnlich geht nicht.

    Meine Version für die Navigationsadresse NavAddr ist http://www.qrz.com/db/HB9BQR/ wobei HB9BQR bei jedem Aufruf wechselt.

    Vielleicht kannst Du mit weiterhelfen, möglicherweise sind wir kurz vor dem Loch. Vielen Dank, Roland HB9BQR

    Montag, 19. November 2018 10:46
  • Hallo Roland,

    die Schreibweise $"Irgendwas{Variable}" gibt es erst in neueren C#/VB.NET Versionen bzw. auch IIRC erst ab VS 2017 und stellt eine verkürzte Fassung für String.Format dar. Falls das in deinem Fall das Problem sein sollte, kannst Du auch die klassische Schreibweise verwenden.

    Me.IE.Navigate( String.Format( "http://www.irgendwas.tld/?counter={0}", Me.Counter )

    In deinem konkreten Fall wäre das dann bspw.:

    Dim NavAddr
        NavAddr = String.Format( "http://www.qrz.com/db/{0}/", <UrlParameter> )
    
        Me.IE.Navigate( NavAddr )
    

    Mein Beispiel mit dem Zähler war nur das, was es sein sollte: Eben ein Beispiel :) Das brauchst Du an der Stelle natürlich nicht in dieser Form. Es ging mir nur darum, zu zeigen, dass es problemlos möglich ist, mit einem Tab/Fenster des IE x verschiedene Navigationen durchzuführen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Montag, 19. November 2018 11:39
    Moderator
  • Ich habe versucht, die Hinweise umzusetzen. Die erste Navigation des IE ist richtig. Der Browser zeigt oben z. B. https://www.qrz.com/db/0/HB9BAT an. Die nächste Navigation misslingt. "RPC-Server nicht verfügbar". Der Counter zählt korrekt auf. Hier der Code.

    Ich wäre dankbar für Hinweise. Für mich als Amateur eine anspruchsvolle Erweiterung eines nützlichen Projekts.

    1  Imports SHDocVw

    3  Public Class Form1

    4      Private Property IE As SHDocVw.InternetExplorer

    5      Private Property Counter As Integer

    7      Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

    8      End Sub

    10     Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

    11      If Me.IE Is Nothing Then

    12           Me.IE = Me.CreateNewIE()

    13       End If

    14       Me.IE.Navigate("http://www.qrz.com/db/" & Counter.ToString & "/" & TextBox1.Text)

    15       Me.Counter += 1

    16   End Sub

    18    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click

    19        CloseIE()

    20    End Sub

    22    Private Function CreateNewIE() As SHDocVw.InternetExplorer

    23        Dim Result As New SHDocVw.InternetExplorer()

    24        Result.Visible = True

    25        Return Result

    26    End Function

    28    Private Sub CloseIE()

    29        Me.IE.Stop()

    30        Me.IE.Quit()

    31        Me.IE = Nothing

    32    End Sub

    33 End Class

    Freitag, 30. November 2018 14:39
  • Hallo Roland,

    was willst Du mit dem Zähler? Der war, wie schon geschrieben, nur für mein Beispiel gedacht und nicht für deinen Code.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Freitag, 30. November 2018 15:06
    Moderator