これまでは、次の関数を使用して、実行中のInternet Explorerインスタンスに対してIWebBrowser2ポインタを取得しました。私は何PIDを指定したIE8ウィンドウの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;
}
はCreateProcess
経由explorer.exe
プロセスを起動してから(私はブラウザをいじることができるように)、それに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);
}
このコードの最初の実行はうまく動作し、2番目のコードシーケンスは決してpWebBrowserウィンドウを取得しません。
デバッグのビットの後、それが(そしてそれが2番目のブラウザインスタンスを起動した後、より多くのを見つけた)findBrowserByPID
機能は、ブラウザのウィンドウをたくさん見つけないことが明らかになったが、それらのどれも、新たに開始したプロセスに属していません。すべてのウィンドウは、開始された最初のIEプロセスに属しているようです。
誰かがIE8インスタンスのIWebBrowser2ポインタを取得する別の方法を知っていますか?または、おそらくIE8でプロセスのこの明らかな '再利用'を無効にする方法はありますか?
LCIEを無効にするにはレジストリキーを使用できますが、これはエンドユーザーにとってはサポートされていない設定です。自分のマシン以外でこれを行う場合は、それは適切ではありません。 今日の「pid-to-IWB2」のアプローチは、必ずしも将来的には機能しないことに注意してください。 IEは、この関数にサポートされているAPIを公開していません。 – EricLaw
@EricLaw:ああ、「LCIE」という言葉を削除していただきありがとうございます。これはgoogleのためのものです! –