문제

지금까지 PID가 주어진 Internet Explorer 인스턴스에 대한 iWebBrowser2 포인터를 검색하기 위해 다음 기능을 성공적으로 사용했습니다.

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;
}

내가하는 일은 시작하는 것입니다 explorer.exe 프로세스를 통해 CreateProcess 그런 다음 위의 기능을 사용하여 iwebbrowser2ptr을 검색하여 브라우저와 함께 바이올링 할 수 있습니다.

불행히도, 이것은 IE8이 프로세스를 적어도 어느 정도 재사용하는 것처럼 보이기 때문에 이것은 더 이상 Internet Explorer 8과 함께 작동하지 않는 것 같습니다. 두 가지 코드 시퀀스의 경우 :

PROCESS_INFORMATION pi;
// ...

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

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

이 코드의 첫 번째 실행은 잘 작동하며 두 번째 코드는 Pwebbrowser 창을 검색하지 않습니다.

약간의 디버깅 후 findBrowserByPID 함수는 많은 브라우저 창을 찾습니다 (두 번째 브라우저 인스턴스를 시작한 후에는 더 많이 찾음). 모든 창은 시작된 첫 번째 IE 프로세스에 속한 것 같습니다.

IE8 인스턴스에 대한 iWebBrowser2 포인터를 얻는 대안적인 방법을 아는 사람이 있습니까? 아니면 IE8을 사용 하여이 명백한 '재사용'을 비활성화 할 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

IE 프로세스를 직접 시작하는 경우 CreateProcess를 사용하지 마십시오. 대신 CocreateInstance를 사용하십시오. 그렇다면 iwebbrowser2를 쿼리 할 수있는 객체를 반환합니다. 한 가지 복잡성은 내비게이션이 무결성 수준 (Vista+)을 가로 지르면 포인터가 유효하지 않다는 것입니다. 이 문제를 해결하려면 NewProcess 이벤트를 동기화 하여이 조건을 감지 할 수 있습니다.

여기를 참조하십시오. http://msdn.microsoft.com/en-us/library/aa752084%28vs.85%29.aspx

다른 팁

몇 가지 대안적인 접근법이 다음과 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top