Frage

Bisher habe ich erfolgreich die folgende Funktion den IWebBrowser2 Zeiger auf einem laufenden Internet Explorer Instanz zu erhalten, da es ist PID.

static SHDocVw::IWebBrowser2Ptr findBrowserByPID( DWORD pid )
{
    SHDocVw::IShellWindowsPtr ptr;
    ptr.CreateInstance(__uuidof(SHDocVw::ShellWindows));
    if ( ptr == NULL ) {
        return 0;
    }

    // number of shell windows
    const long nCount = ptr->GetCount();

    // iterate over all shell windows
    for (long i = 0; i < nCount; ++i) {
        // get interface to item no i
        _variant_t va(i, VT_I4);
        IDispatchPtr spDisp = ptr->Item(va);

        SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
        if (spBrowser != NULL) {
            // if there's a document we know this is an IE object
            // rather than a Windows Explorer instance
            HWND browserWindow;
            try {
                browserWindow = (HWND)spBrowser->GetHWND();
            } catch ( const _com_error &e ) {
                // in case ->GetHWND() fails
                continue;
            }

            DWORD browserPID;
            GetWindowThreadProcessId( browserWindow, &browserPID );
            if ( browserPID == pid ) {
                return spBrowser;
            }
        }
    }
    return 0;
}

Was ich tue, ist ein explorer.exe Prozess über CreateProcess zu starten und dann die obige Funktion verwenden, um die IWebBrowser2Ptr, um es zu holen (so, dass ich mit dem Browser Geige kann).

Leider scheint dies nicht mehr 8 mit dem Internet Explorer zu arbeiten, da IE8 Prozesse wieder zu verwenden scheint - zumindest bis zu einem gewissen Grad. Für zwei Codesequenzen wie:

PROCESS_INFORMATION pi;
// ...

if ( CreateProcess( ..., &pi ) ) {
    // Wait a bit to give the browser a change to show its window
    // ...

    IWebBrowser2 *pWebBrowser = findBrowserByPID( pi.dwProcessId );
}

Der erste Lauf dieses Code funktioniert gut, die zweite verwaltet nie das pWebBrowser Fenster abgerufen werden.

Nach einem wenig Debugging, wurde bekannt, dass die findBrowserByPID Funktion hat viele Browser-Fenster finden (und es findet mehr nach einer zweiten Browser-Instanz ausgehend), aber keiner von ihnen auf den neu gestarteten Prozess gehört. Es scheint, dass alle Fenster auf den ersten IE Prozess gehören, die gestartet wurde.

Kennt jemand eine alternative Art und Weise den IWebBrowser2-Zeiger zu einem gewissen IE8 Instanz zu bekommen? Oder gibt es vielleicht eine Möglichkeit, diese scheinbare ‚Wiederverwendung‘ deaktivieren von Prozessen mit IE8?

War es hilfreich?

Lösung

Wenn Sie den IE-Prozess sind Start selbst, verwenden CreateProcess-- nicht stattdessen verwenden CoCreateInstance. Das wird wieder ein Objekt, für das Sie für IWebBrowser2 abfragen können, die Sie nach Belieben verwenden können. Die eine Komplexität ist, dass, wenn die Navigationsintegritätslevel (Vista +) kreuzt der Zeiger ungültig wird. Um dieses Problem zu beheben, synchronisieren die NewProcess Veranstaltung, die es Ihnen erlaubt, diesen Zustand zu erkennen.

hier einige weitere Informationen siehe: http: / /msdn.microsoft.com/en-us/library/aa752084%28VS.85%29.aspx

Andere Tipps

Ein paar alternative Ansätze könnten sein:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top