3,248
社区成员
发帖
与我相关
我的任务
分享
#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);
}
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个参数来得到你要的值
*/
}
}