描述:
我在BHO的Invoke函数中有这么一段代码;
case DISPID_NEWWINDOW2:
{
// break;
HRESULT hr;
IWebBrowser2* pWebBrowser = NULL;
HRESULT comInit = CoInitializeEx(NULL,COINIT_MULTITHREADED);
hr = CoCreateInstance(CLSID_InternetExplorer, NULL,CLSCTX_LOCAL_SERVER ,IID_IWebBrowser2,
(LPVOID*)&pWebBrowser);
if (SUCCEEDED (hr) && (pWebBrowser != NULL))
{
CComQIPtr<IDispatch> piDisp;
pWebBrowser->get_Application(&piDisp);
piDisp.CopyTo(pDispParams->rgvarg[1].ppdispVal);
//2 获取新创建WebBrowe 窗口的句柄
long hWnd = 0;
pWebBrowser->get_HWND(&hWnd);
DbgPrint("添加窗口指针 %u %d",hWnd,GetCurrentProcessId());
//3 添加到vector中
if( hWnd != NULL )
{
AddToWndList(hWnd);
}
}
break;
}
每次有新窗口打开的时候,都会调用CoCreateInstance函数创建一个对象,但是我发现有一个问题,假设现在我打开2个IE,IE1和IE2,IE1先打开,IE2后打开,在IE2中有新窗口打开,新打开的窗口却是IE1进程的新窗口,却不是IE2进程的窗口,我上网找了资料,网上说:CoCreateInstance函数的CLSCTX_LOCAL_SERVER 参数是使得在其他进程中创建对象,而参数CLSCTX_INPROC_SERVER是在本进程中创建对象。但是我试过,同时使用CLSCTX_INPROC_SERVER和CLSID_InternetExplorer参数的话,CoCreateInstance函数会失败请问:有没有办法,使得我在DISPID_NEWWINDOW2中创建的对象,是在IE2进程中的窗口,而不是IE1进程的窗口。
解决方案1:
hr = CoCreateInstance(CLSID_InternetExplorer, NULL,CLSCTX_LOCAL_SERVER ,IID_IWebBrowser2,
(LPVOID*)&pWebBrowser);
改成:
CoCreateInstance(CLSID_WebBrowser, NULL,CLSCTX_INPROC,
IID_IWebBrowser2, (void**)&pWebBrowser);