无法获取到弹出新的IE窗口的IWebBrowser2

zshwlw 2008-10-06 08:33:28

#include <windows.h>
#include <exdisp.h>
#include <ExDispID.h>
#include <atlbase.h>
#include <AtlConv.h>
#include <exception>

VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);

class CEventSink : public IDispatch
{
protected:
DWORD m_dwRef;

public:
CEventSink(){m_dwRef = 0;}
~CEventSink(){m_dwRef--;}

STDMETHODIMP QueryInterface(REFIID riid, void** ppv)
{
*ppv = NULL;

if (riid == IID_IUnknown || riid == IID_IDispatch)
*ppv = this;

if (*ppv)
{
((LPUNKNOWN)*ppv)->AddRef();
return (S_OK);
}
return E_NOINTERFACE;
}

STDMETHODIMP_(ULONG) AddRef()
{
return ++m_dwRef;
}

STDMETHODIMP_(ULONG) Release()
{
if (--m_dwRef)
return m_dwRef;
delete this;
return 0;
}

STDMETHODIMP GetTypeInfoCount( UINT* pctinfo )
{
*pctinfo = 0;
return S_OK;
}

STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
{
if ( pptinfo )
*pptinfo = 0;
return E_NOTIMPL;
}

STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR** rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid)
{
return S_OK;
}

STDMETHODIMP CEventSink::Invoke(DISPID dispidMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS* pdispparams,
VARIANT* pvarResult,
EXCEPINFO* pexcepinfo,
UINT* puArgErr)
{
switch (dispidMember)
{
case DISPID_NEWWINDOW2:
CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> spBrowser;
try
{
//此处发生异常
spBrowser = pdispparams->rgvarg[1].pdispVal;
}
catch (...)
{
MessageBox(NULL, "123", "", MB_OK);
}

break;
}
return S_OK;
}
};

IUnknown *sink = NULL;

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;

CoInitialize(NULL);

SetTimer(NULL, 1, 5000, (TIMERPROC)TimerProc);

sink = new CEventSink;

while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

delete sink;

CoUninitialize();

return 0;
}

VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
IWebBrowser2 *pWBApp = NULL;
IConnectionPointContainer* pCPC = NULL;
IConnectionPoint* pCP = NULL;
DWORD dwCookie;

CoCreateInstance(CLSID_InternetExplorer,
NULL,
CLSCTX_SERVER,
IID_IWebBrowser2,
(LPVOID*)&pWBApp);
pWBApp->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);
pCPC->FindConnectionPoint(DIID_DWebBrowserEvents2, &pCP);

pCP->Advise(sink, &dwCookie);

BSTR bstrURL = NULL;
VARIANT vFlags = {0}, vTargetFrameName = {0}, vPostData = {0}, vHeaders = {0};

bstrURL = SysAllocString(L"http://192.168.0.90:81/index.html");
pWBApp->Navigate(bstrURL, &vFlags, &vTargetFrameName, &vPostData, &vHeaders);
pWBApp->put_Visible(VARIANT_TRUE);
}

我在打开的网页中加入的JS代码弹出新的IE窗口,我想要获取新弹出IE窗口的句柄,
但是下面这行代码发生异常,导致不能获取IWebBrowser2,请高手指点如何才能获取IWebBrowser2。
spBrowser = pdispparams->rgvarg[1].pdispVal;
...全文
243 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zshwlw 2008-10-09
  • 打赏
  • 举报
回复
再顶一顶,希望大家帮助我啊
zshwlw 2008-10-08
  • 打赏
  • 举报
回复
我用的是VC6,没有DISPID_NEWWINDOW3宏定义,按照msdn上的说法响应DISPID_NEWWINDOW2这个消息也是可以的,并且rgvarg[1]就是**pDisp
controstr 2008-10-08
  • 打赏
  • 举报
回复
在函数

Invoke(DISPID dispidMember,REFIID riid, LCID lcid, WORD wFlags,
DISPPARAMS * pDispParams, VARIANT * pvarResult,
EXCEPINFO * pexcepinfo, unsigned int FAR * puArgErr)
{
switch ( dispidMember )
{
case DISPID_NEWWINDOW3:
/*
参数pDispParams->rgvarg是一个数组,其中值如下
//0 : bstrUrl, 1 : bstrContext, 2 : dwFlags, 3 : *bCancel, 4 : **pDisp
你可以根据第4个参数来得到你要的值
*/
}
}
zshwlw 2008-10-08
  • 打赏
  • 举报
回复
再顶一顶,希望大家帮助我啊
zshwlw 2008-10-08
  • 打赏
  • 举报
回复
再顶一下,请大家帮帮忙啊
zshwlw 2008-10-07
  • 打赏
  • 举报
回复
顶一下
zshwlw 2008-10-07
  • 打赏
  • 举报
回复
自己顶一下,希望大家帮忙

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧