描述:
自动化浏览器时出了问题,没法解决。
捕获浏览器事件直接造成浏览器阻塞,除非断开事件连接,否则浏览器无法继续运行
//iectrl.cpp
#include <windows.h>
#include ".\ieSink.h"
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
CoInitialize(NULL);
IWebBrowser2 *m_pInternetExplorer;
HRESULT hr;
CIESink ieSink;
hr=CoCreateInstance(CLSID_InternetExplorer,NULL,CLSCTX_SERVER,IID_IWebBrowser2,(LPVOID *)&m_pInternetExplorer);
m_pInternetExplorer->put_Visible(VARIANT_TRUE);
if(SUCCEEDED(hr))
{
ieSink.Connect(m_pInternetExplorer);//连接事件捕获
BSTR Url,Target,PostData,Head;
VARIANT BstrUrl,BstrTarget,IFlag,BstrPostData,BstrHead;
V_VT(&BstrUrl)=VT_BSTR;
V_BSTR(&BstrUrl)=Url=SysAllocString(L"http://www.baidu.com");
V_VT(&BstrTarget)=VT_BSTR;
V_BSTR(&BstrTarget)=Target=SysAllocString(L"_self");
V_VT(&BstrPostData)=VT_BSTR;
V_BSTR(&BstrPostData)=PostData=SysAllocString(L"_self");
V_VT(&BstrHead)=VT_BSTR;
//V_BSTR(&BstrHead)=Head=SysAllocString(L"Content-Type: application/x-www-form-urlencoded\r\n");
V_BSTR(&BstrHead)=Head=SysAllocString(L"");
V_VT(&IFlag)=VT_I4;
V_I4(&IFlag)=navNoHistory;
m_pInternetExplorer->Navigate2(&BstrUrl,&IFlag,&BstrTarget,&BstrPostData,&BstrHead);
SysFreeString(Url);
SysFreeString(Target);
SysFreeString(PostData);
SysFreeString(Head);
}
system("pause");
ieSink.DisConnect();
return TRUE;
}
//iesink.cpp
#include ".\iesink.h"
CIESink::CIESink(void)
: m_pConnectionPoint(0)
, m_dwCookie(0)
{
}
CIESink::~CIESink(void)
{
}
STDMETHODIMP_(ULONG) CIESink::AddRef()
{
return E_NOTIMPL;;
}
STDMETHODIMP_(ULONG) CIESink::Release()
{
return E_NOTIMPL;;
}
STDMETHODIMP CIESink::QueryInterface(REFIID riid, LPVOID* ppv)
{
*ppv = NULL;
if (IID_IUnknown == riid)
{
*ppv = (LPUNKNOWN)this;
return NOERROR;
}
else if (IID_IDispatch == riid)
{
*ppv = (IDispatch*)this;
return NOERROR;
}
else
return E_NOTIMPL;
}
STDMETHODIMP CIESink::Invoke(DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS __RPC_FAR *pDispParams,
VARIANT __RPC_FAR *pVarResult,
EXCEPINFO __RPC_FAR *pExcepInfo,
UINT __RPC_FAR *puArgErr)
{
ODS("invoke\n");
return NOERROR;
}
STDMETHODIMP CIESink::Connect(IWebBrowser2 *pInternetExplorer)
{
IConnectionPointContainer *pCPContainer;
HRESULT hr=pInternetExplorer ->QueryInterface(IID_IConnectionPointContainer,(void **)&pCPContainer);
if (SUCCEEDED(hr))
{
hr=pCPContainer->FindConnectionPoint(DIID_DWebBrowserEvents2,&m_pConnectionPoint);
pCPContainer->Release();
if(SUCCEEDED(hr))
{
hr=m_pConnectionPoint->Advise(this,&m_dwCookie);
}
}
return S_OK;
}
STDMETHODIMP CIESink::DisConnect()
{
HRESULT hr = NOERROR;
if (m_pConnectionPoint)
{
if (m_dwCookie)
{
hr = m_pConnectionPoint->Unadvise(m_dwCookie);
m_dwCookie = 0;
}
m_pConnectionPoint->Release();
m_pConnectionPoint = NULL;
}
return NOERROR;
}
//iesink.h
#pragma once
#include "oaidl.h"
#include <ExdispID.h>
#include <Exdisp.h>
#define ODS(x) OutputDebugString(x)
class CIESink :
public IDispatch
{
public:
CIESink(void);
~CIESink(void);
// IUnknown methods
STDMETHOD(QueryInterface)(REFIID riid, LPVOID* ppv);
STDMETHOD_(ULONG, AddRef)();
STDMETHOD_(ULONG, Release)();
// IDispatch method
STDMETHOD(GetTypeInfoCount)(UINT* pctinfo)
{ ODS("GetTypeInfoCount\n"); return E_NOTIMPL; }
STDMETHOD(GetTypeInfo)(UINT iTInfo,
LCID lcid,
ITypeInfo** ppTInfo)
{ ODS("GetTypeInfo\n"); return E_NOTIMPL; }
STDMETHOD(GetIDsOfNames)(REFIID riid,
LPOLESTR* rgszNames,
UINT cNames,
LCID lcid,
DISPID* rgDispId)
{ ODS("GetIDsOfNames\n"); return E_NOTIMPL; }
STDMETHOD(Invoke)(DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS __RPC_FAR *pDispParams,
VARIANT __RPC_FAR *pVarResult,
EXCEPINFO __RPC_FAR *pExcepInfo,
UINT __RPC_FAR *puArgErr);
//this class
STDMETHOD(Connect)(IWebBrowser2 *pInternetExplorer);
STDMETHOD(DisConnect)();
private:
// 连接点
IConnectionPoint *m_pConnectionPoint;
DWORD m_dwCookie;
};
解决方案1:
只用在STA才需要消息循环吧,MTA不需要的
STA= single-threaded apartment
MTA= multiple-threaded apartment
消息循环哪里去了