javascript之external和VC对象交互

本文探讨了JS脚本引擎中的external特性,通过C++类实现与MSHTML对象交互的过程。具体分析了如何在C++类CTraceViewDlg中实现IDispatch接口的GetExternal方法,以及初始化对话框时创建HTML文档控件的方法。

1.关于JS脚本引擎之external研究
class AFX_NOVTABLE CCmdTarget : public CObject
{
 // OLE automation implementation
protected:
 struct XDispatch
 {
  DWORD_PTR m_vtbl;   // place-holder for IDispatch vtable
#ifndef _AFX_NO_NESTED_DERIVATION
  size_t m_nOffset;
#endif
 } m_xDispatch;
}

//-------------

2.

//当然CDialog是间接继承了CCmdTarget类的

class CTraceViewDlg : public CDialog{


BOOL OnInitDialog();

 

STDMETHODIMP GetExternal(IDispatch **ppDispatch);


}

 

STDMETHODIMP CTraceViewDlg::GetExternal(IDispatch **ppDispatch)
{
 if(ppDispatch == NULL)
  return E_POINTER;
 *ppDispatch = (IDispatch *)&m_xDispatch;
 ((IDispatch *)*ppDispatch)->AddRef();

 return S_OK;
}

 


BOOL CTraceViewDlg::OnInitDialog()
{
 AfxEnableControlContainer();

 CDialog::OnInitDialog();

 CRect rectClient;
 GetClientRect(&rectClient);

//创建mshtml对象, Html、JS解析渲染引擎
 m_wndHTMLView.CreateControl(CLSID_HTMLDocumentEx, NULL,
  WS_VISIBLE | WS_CHILD, rectClient, this, AFX_IDC_BROWSER);

 return TRUE;
}

 

3.

mshtml对象加载的javaScript代码中如果出现external.funcName();的情况,则会调用其父类指针的虚函数GetExternal

当然你会觉得奇怪,为何CTraceViewDlg没有实现IDocHostUIHandler接口,却可以调用ostUIHandler::GetExternal函数呢,这就需要研究C++之虚函数本质了

注释:来自MSDN

IDocHostUIHandler::GetExternal Method

Called by MSHTML to obtain the host's IDispatch interface.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北京橙溪 www.enwing.com

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值