PID가 주어진 IE8 창의 iwebbrowser2 포인터를 찾는 방법은 무엇입니까?
-
22-07-2019 - |
문제
지금까지 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
다른 팁
몇 가지 대안적인 접근법이 다음과 같습니다.
라이브러리와 같은 라이브러리를 사용하십시오 Watin IE를 자동화하려는 경우 실제 최종 목표를 수행하는 데 도움이 될 수 있습니다.