Newsgroup: it.comp.programmare.win32
Titolo: lanciare processo iexplore

Ciao a tutti,
il mio problema è questo:
da una applicazione devo lanciare iexplore; uso quindi l'API 
CreateProcess.
 
STARTUPINFO si;
::ZeroMemory (&si, sizeof (STARTUPINFO));
si.cb = sizeof (STARTUPINFO);
PROCESS_INFORMATION pi;
if (::CreateProcess (NULL, _T("c:\\path\\iexplore"), NULL,
	NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi)) {
	::CloseHandle (pi.hThread);
	::CloseHandle (pi.hProcess);
}
 
L'unico inconveniente è che devo passare all'API il percorso completo 
del file iexplore.exe; d'altra parte il percorso di iexplore può essere 
diverso per differenti computer. 
C'è quindi un modo per risalire al percorso di iexplore in modo da 
permettere che l'applicazione possa girare su qualsiasi PC?
 
Grazie.
 
--
Posted from 
smtp1.libero.it
 [193.70.192.51]
via Mailgate.ORG Server - 
http://www.mailgate.org

Prova con ShellExecute.
Fausto


 permettere che l'applicazione possa girare su qualsiasi PC?
La ShellExecute che gia` ti e` stata suggerita va benone, comunque
per fare le cose piu` a basso livello c'e` anche ampia varieta` di altre
scelte, come l'API FindExecutable e l'API SearchPath per altre ma
simili esigenze.
Alex

Risposta + domanda (in coda)
Un modo elegante per lanciare Internet Explorer è attrverso COM. I passi
sono pochi e semplici; principalmente: ottenere il clsid dell'oggetto
'Applicazione Internet Explorer' e creare un'istanza dell'oggetto
'Applicazione Internet Explorer':
CLSID clsidIE;
IWebBrowserApp *pwb;
OleInitialize(NULL);
ClsidFromProgId(L"InternetExplorer.Application",&clsidIE);
CoCreateInstance(clsidIE,NULL,CLSCTX_ALL,IID_IWebBrowserApp,reinterpret_cast
<void **>(&pwb));
se la funzione ha esito positivo dovrai rendere visibile l'applicazione nel
seguente modo:
pwb->put_Visible(VARIANT_TRUE);
ed eventualmente:
pwb->Release();   // questo NON chiuderà IE
OleUninitialize();
Le dichiarazioni di IID_IWebBrowserApp e del layout delle interfacce si
trovano nel file 'Exdisp.h', in cui in effetti si trova anche il clsid di IE
(puoi anche risparmiarti la chiamata ClsidFromProgId).
Ricordati di includere 'initguid.h' per rendere 'definizioni' le
dichiarazioni dei guid.
Il vantaggio principale di questo metodo (oltre a non doverti preoccupare
del path) è dato dal fatto che possedendo un puntatore a interfaccia, puoi
controllare molti degli aspetti dell'applicazione: l'interfaccia
IWebBrowserApp ti permette di controllare la visualizzazione di IE (quante e
quali barre, modalità a schermo intero, ecc.); l'nterfaccia IWebBrowser ti
permette di controllare le funzionalità di IE (i metodi Navigate, GoBack,
GoForward, GoHome, GoSearch, Stop, Refresh parlano da soli); IWebBrowserApp
eredita direttamente da IWebBrowser. In più con una semplice chiamata a
QueryInterface puoi accedere all'interfaccia IWebBrowser2 che mette a
disposizione alcune funzionalità tipiche della versione più recente di IE.
Se queste possibilità non ti interessano, puoi chiamare la Release subito
dopo aver reso visibile l'applicazione.
Mi sembrava ci fosse ancora qualcosa di importante da dire, ma non riesco a
ricordarmelo.
Vorrei fare una domanda su questo argomento:
tempo fa ho pensato: "Se i programmatori della MS si sono dati da fare per
rendere IE un automation server, dovrebbe essere lecito pensare che IE
stesso si autoregistri come 'oggetto attivo' con la funzione
RegisterActiveObject (anche il fatto che Release non termini l'app. fa
pensare ad uno 'strong lock'; per non parlare del fatto che programmi che
presentano link, riescano benissimo ad 'agganciarsi' a istanze attive di
IE)". Ho pensato inoltre: "se il pensiero n.1 è corretto, dovrei riuscire ad
ottenere una IUnknown con una chiamata all'API OLE GetActiveObject, che
dovrebbe spulciare la ROT per me". GetActiveObject restituisce però un
laconico 'Operazione non disponibile'; la chiamata è molto semplice e,
direi, poco soggetta a errori (3 parametri: il clsid dell'oggetto, un
parametro riservato e l'indirizzo di un punt. IUnknown). C'è forse qualche
altra operazione preliminare (oltre ad OleInitialize) da effettuare?
Mi sarebbe piaciuto anche provare a chiamare GetRunningObjectTable e
successivamente chiamare IRunningObjectTable::GetObject, ma non ho ancora
approfondito i moniker (ho solo letto una volta alla veloce il capitolo 9 di
Inside OLE) e non ho ben chiaro come procedere per ottenerne uno buono da
passare a GetObject.
P.S. : mi scuso per gli eventuali errori, ma oggi è uno di quei giorni in
cui Outlook Express si rifiuta di fare il controllo ortografico.
Stefano.

 IE)".
Dipende da come hai settato le opzioni/preferenze di IE.  Da me il
primo clic su di un link in una certa applicazione apre sempre una
finestra IE nuova (preferisco cosi`).  Sospetto (non ho sperimentato)
che con un diverso settaggio delle opzioni IE lavori come singleton
globale (CoCreateInstance puo` tornare sempre la stessa istanza).
Alex

 MSDN trovi tutti i dettagli.
Uhm, allora: su MSDN ho trovato un articolo (Knowledge Base) dove si spiega
che per fare in modo che IE carichi un Browser Helper Object bisogna
registrarlo anche in una sottochiave ecc. ecc. ecc.; si dice anche che
l'oggetto deve implementare IObjectWithSite.
Il problema è questo:
IE non si sogna nemmeno di caricare l'oggetto: la registrazione 'ordinaria'
viene effettuata correttamente. La registrazione aggiuntiva è banale; l'ho
fatta a mano con un bel CRTL+C sul clsid dell'oggetto e un bel CTRL+V al
momento di digitare il nome della nuova sottochiave. Ho inserito una
MessageBox come prima istruzione della DllMain quindi, qualunque vaccata
possa aver scritto nell'implementazione dell'oggetto, se IE cercasse di
caricarla dovrebbe almeno chiamare LoadLibrary e questo eseguirebbe la
MessageBox; inutile dire che del messaggio non si vede nemmeno l'ombra.
Nell'implementazione dell'oggetto, mi sono limitato a chiamare
RegisterActiveObject in SetSite e a chiamare RevokeActiveObject nel
distruttore. Mi pare di aver capito che non si debba fare niente di
particolare in GetSite (ho impostato *ppv a NULL e ho restituito E_FAIL
visto che la documentazione dice che E_NOTIMPL non è ammesso). Ad ogni modo,
questo, è tutto codice che non viene eseguito.
Grazie,
Stefano.

 IE non si sogna nemmeno di caricare l'oggetto: la registrazione
'ordinaria'
Puo` essere necessario un reboot, perche` solo alla ripartenza del processo
IE viene letta la registry.
Alex

 IE viene letta la registry.
E' la prima cosa che ho fatto; non so proprio cosa pensare. Comunque,
grazie.
Stefano.