F r a n c e s c o   S m e l z o
Software engineering - Sistemi web - Formazione - Sicurezza - Privacy - IT consultant
Home e-mail

VB.NET : aprire una url in un'istanza attiva di Internet Explorer

27/8/2005
di Francesco Smelzo
All'inizio il problema sembrava semplice: aprire da programma una finestra di IE e caricare una pagina web.
Il tutto sarebbe risolvibile con:
Imports System
Imports System.Diagnostics

Public Module Test
    Sub Navigate2(ByVal IeUrl As String)
        System.Diagnostics.Process.Start("iexplore.exe", IeUrl)
    End Sub
End Module
Semplice no? Ma qual'è il problema? E' che ogni volta che si richiama la funzione si apre una nuova finestra e quindi mi potevo accontentare? effettivamente potevo ma comunque ...
La soluzione (dopo averle provate di tutte!) stava nell'importare nelle referenze del progetto il riferimento alla libreria COM SHDocVw.dll (quella di Internet Explorer per intenderci, sta in System32).
Una volta importata la libreria nel progetto (e capito come funziona) le cose si sono fatte più semplici.
Imports System
Imports System.Diagnostics
Imports System.Runtime.InteropServices
Public Module Test
	
	'Funzione pinvoke che porta la finestra in primo piano
    <DllImport("user32.dll")> _
    Private Function SetForegroundWindow(ByVal hWnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function
    
	Sub Navigate2(ByVal IeUrl As String)
        Dim shellWins As New SHDocVw.ShellWindowsClass
        Dim explorer As SHDocVw.InternetExplorer
        Dim en As IEnumerator = shellWins.GetEnumerator
        While en.MoveNext
		'cerca una finestra aperta di IE
		 explorer = en.Current ' l'oggetto SHDocVw.InternetExplorer corrente
		 explorer.Navigate2(IeUrl) 'chiama il metodo Navigate2 dell'oggetto SHDocVw.InternetExplorer corrente
		 SetForegroundWindow(New IntPtr(explorer.HWND)) 'porta la finestra in primo piano
		 Return 'esce 
        End While
		'se il programma arriva qui vuol dire che non ha
		'trovato nessuna finestra aperta ed allora procede nel modo precedente
        System.Diagnostics.Process.Start("iexplore.exe", IeUrl)
    End Sub
	
End Module

Un'ultima cosa : io volevo compiere l'operazione da una macro di Visual Studio. Dovevo quindi aggiungere il riferimento a SHDocVw nell'ambiente dell'IDE delle Macro, ma ciò non sembrava possibile perchè nella finestra riferimenti dell'IDE macro non appare il Tab COM che contiene appunto la lista delle librerie COM importabili.

Ho quindi scoperto che l'IDE delle Macro carica gli assembly esclusivamente dalla directory <Programmi>\Microsoft Visual Studio .NET 2003\Common7\IDE\PublicAssemblies.

Ho quindi creato un progetto in VS Studio, vi ho importato il riferimento a SHDocVw e l'ho compilato.
In questo modo VS Studio ci crea automaticamente l'assembly di interoperabilità con COM che si trova nella directory \obj del progetto ( si chiama Interop.SHDocVw.dll).
A questo punto basta copiare questo assembly nella directory <Programmi>\Microsoft Visual Studio .NET 2003\Common7\IDE\PublicAssemblies, chiudere e riaprire l'IDE delle Macro, aggiungere il riferimento ... et volià.

Controllo disponibilita'

Valid XHTML 1.0!



Riferimenti - Cell. 338 2556588    Mail: francesco@smelzo.it