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

被折叠的 条评论
为什么被折叠?



