1 示例: QAxWidget 加载 IE插件
第一步 加载ie控件
void CActivexWidget::InitActiveX() //其中 CActivexWidget 派生自QAxWidget
{
setControl("Shell.Explorer");//HKEY_CLASSES_ROOT\Shell.Explorer
setObjectName(QString::fromUtf8("mywebkit"));//随便设置一个名字啦
}
第二步 浏览http或https
m_pAxWidget->dynamicCall("Navigate(const QString&)", sAppPath);//其中 m_pAxWidget 为CActivexWidget一个指针
第三步: qt调用html函数
QString sValue ;
sValue=QString::fromLocal8Bit(pData);
QAxObject *document =m_pAxWidget->querySubObject("Document");
if(!document)
return ;
QAxObject *parentWindow = document->querySubObject("parentWindow");
if(parentWindow)
{
OutLog("put data to html %s",pData);
parentWindow->dynamicCall("OnDataFromExternal (QString&)", sValue); //其中 OnDataFromExternal 为html里的函数
}
第四部 html调用qt
这一步比较麻烦 需要继承几个类
第一步 继承QAxWidget 并重写QAxAggregated *createAggregate();
class CActivexWidget : public QAxWidget
{
public:
CActivexWidget(QWidget *parent);
~CActivexWidget();
public:
virtual QAxAggregated *createAggregate();
virtual void InitActiveX();
protected:
CAxAggregated *m_pAggregated;
};
第二步 继承 QAxAggregated 并重写 virtual long queryInterface(const QUuid &iid, void **iface);
class CAxAggregated :
public QAxAggregated
{
public:
CAxAggregated(void);
virtual ~CAxAggregated(void);
virtual long queryInterface(const QUuid &iid, void **iface);
protected:
CExternalDocHostUIHandler *m_pExternalHandle ;
};
第三步 写一个类 继承 IDocHostUIHandler
class CExternalDocHostUIHandler :
public IDocHostUIHandler
{
//实现 IDocHostUIHandler的所有接口
//着重实现 HRESULT STDMETHODCALLTYPE GetExternal( IDispatch **ppDispatch)
}
HRESULT CExternalDocHostUIHandler::GetExternal( IDispatch **ppDispatch)//其中 m_pJSCall 为一个继承自IDispatch的类指针
{
m_pJSCall->QueryInterface(IID_IDispatch,(void**)ppDispatch);;
(*ppDispatch)->AddRef();
return S_OK;
}
到这里就把自定义的external对象传递给了html
剩下的方法 你自己就知道怎么调用了
class CJSCall:public IDispatch
{
long _refNum;
public:
CJSCall();
~CJSCall(void);
// IUnknown Methods
public:
STDMETHODIMP QueryInterface(REFIID iid,void**ppvObject);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// IDispatch Methods
HRESULT _stdcall GetTypeInfoCount(unsigned int * pctinfo) ;
HRESULT _stdcall GetTypeInfo(unsigned int iTInfo,LCID lcid,ITypeInfo FAR* FAR* ppTInfo) ;
HRESULT _stdcall GetIDsOfNames(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames,
LCID lcid, DISPID FAR* rgDispId );
HRESULT _stdcall Invoke(DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS* pDispParams,
VARIANT* pVarResult,EXCEPINFO* pExcepInfo,unsigned int* puArgErr);
};
CJSCall::CJSCall()
{
_refNum = 1;
}
CJSCall::~CJSCall(void)
{
}
STDMETHODIMP CJSCall::QueryInterface(REFIID iid,void**ppvObject)
{
*ppvObject = NULL;
if (iid == IID_IUnknown)
*ppvObject = this;
else if (iid == IID_IDispatch)
*ppvObject = (IDispatch*)this;
if(*ppvObject)
{
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
STDMETHODIMP_(ULONG) CJSCall::AddRef()
{
return ::InterlockedIncrement(&_refNum);
}
STDMETHODIMP_(ULONG) CJSCall::Release()
{
::InterlockedDecrement(&_refNum);
if(_refNum == 0)
{
delete this;
}
return _refNum;
}
// IDispatch Methods
HRESULT _stdcall CJSCall::GetTypeInfoCount(
unsigned int * pctinfo)
{
return E_NOTIMPL;
}
HRESULT _stdcall CJSCall::GetTypeInfo(
unsigned int iTInfo,
LCID lcid,
ITypeInfo FAR* FAR* ppTInfo)
{
return E_NOTIMPL;
}
HRESULT _stdcall CJSCall::GetIDsOfNames(
REFIID riid,
OLECHAR FAR* FAR* rgszNames,
unsigned int cNames,
LCID lcid,
DISPID FAR* rgDispId
)
{
if(lstrcmpW(rgszNames[0], NOTICEDATATOEXTERNAL)==0)
{
//网页调用window.external.CppCall时,会调用这个方法获取CppCall的ID
*rgDispId = FUNC_NOTICEDATATOEXTERNAL_ID;
}
return S_OK;
}
HRESULT _stdcall CJSCall::Invoke(
DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS* pDispParams,
VARIANT* pVarResult,
EXCEPINFO* pExcepInfo,
unsigned int* puArgErr
)
{
if(dispIdMember == FUNC_NOTICEDATATOEXTERNAL_ID)
{
if(pDispParams->rgvarg->vt!=VT_BSTR)
return E_FAIL ;
char* lpszText2 = _com_util::ConvertBSTRToString(pDispParams->rgvarg->bstrVal);
OutLog("recv html Data %s",lpszText2);
g_pQtH5InterAct->FromH5Data(lpszText2);
delete[] lpszText2;
/*VARIANT varRet ;
VariantInit(pVarResult);
varRet.vt =VT_BSTR ;
varRet.bstrVal=SysAllocString(L"Gas");
*pVarResult = varRet;*/
}
return S_OK;
}