/***********************js调用工程中的方法****************************/
// 工程文件
class CTestAppProj : public CWinAppEx
{
...
private:
CChildView *m_pChildView;
public:
HRESULT GetExternal(IDispatch **ppDispatch);
...
};
HRESULT CTestAppProj::GetExternal(IDispatch **ppDispatch)
{
*ppDispatch = NULL;
return m_pChildView->OnGetExternal(ppDispatch);
//return S_FALSE;
}
// HtmlView文件
class CChildView : public CHtmlView
{
public:
CChildView();
virtual ~CChildView();
...
public:
virtual HRESULT OnGetExternal(LPDISPATCH *lppDispatch);
// Onload完成
void OnloadComplete();
void Function01(double dCenterLong, double dCenterLat, double dZoomLevel);
...
};
CChildView::CChildView()
{
// 允许自动化
EnableAutomation();
}
HRESULT CChildView::OnGetExternal(LPDISPATCH *lppDispatch)
{
// 返回自身的IDispatch接口
*lppDispatch = GetIDispatch(TRUE);
return S_OK;
}
// 把成员函数映射到Dispatch映射表中,暴露方法给脚本
BEGIN_DISPATCH_MAP(CChildView, CHtmlView)
DISP_FUNCTION(CChildView, "init", OnloadComplete, VT_EMPTY, VTS_NONE)
DISP_FUNCTION(CChildView, "function01", Function01, VT_EMPTY, VTS_R8 VTS_R8 VTS_R8)
END_DISPATCH_MAP()
// Onload完成
void CChildView::OnloadComplete()
{
}
void CChildView::Function01(double dCenterLong, double dCenterLat, double dZoomLevel)
{
}
// javascript调用
if (typeof(window.external) != "undefined"){
if(typeof(window.external.init) != "undefined"){
try{
window.external.init();
}catch(e){
// alert(e);
}
}
}
/*****************************工程中调用js****************************/
// 执行javascript
BOOL CChildView::ExecJavascript(CStringW& strFunction)
{
IHTMLDocument2 *pHDoc2 = (IHTMLDocument2 *)GetHtmlDocument();
if (pHDoc2 !=NULL)
{
IHTMLElementCollection * all = NULL;
pHDoc2->get_all(&all);
IHTMLWindow2 *p=NULL;
HRESULT hr = pHDoc2->get_parentWindow(&p);
if (SUCCEEDED(hr) && p != NULL)
{
VARIANT varRtn;
BSTR code = ::SysAllocString(strFunction);
BSTR language = ::SysAllocString(L"javascript");
p->execScript(code, language, &varRtn);//执行网页函数
VariantClear(&varRtn);
return TRUE;
}
}
return FALSE;
}
// 工程文件
class CTestAppProj : public CWinAppEx
{
...
private:
CChildView *m_pChildView;
public:
HRESULT GetExternal(IDispatch **ppDispatch);
...
};
HRESULT CTestAppProj::GetExternal(IDispatch **ppDispatch)
{
*ppDispatch = NULL;
return m_pChildView->OnGetExternal(ppDispatch);
//return S_FALSE;
}
// HtmlView文件
class CChildView : public CHtmlView
{
public:
CChildView();
virtual ~CChildView();
...
public:
virtual HRESULT OnGetExternal(LPDISPATCH *lppDispatch);
// Onload完成
void OnloadComplete();
void Function01(double dCenterLong, double dCenterLat, double dZoomLevel);
...
};
CChildView::CChildView()
{
// 允许自动化
EnableAutomation();
}
HRESULT CChildView::OnGetExternal(LPDISPATCH *lppDispatch)
{
// 返回自身的IDispatch接口
*lppDispatch = GetIDispatch(TRUE);
return S_OK;
}
// 把成员函数映射到Dispatch映射表中,暴露方法给脚本
BEGIN_DISPATCH_MAP(CChildView, CHtmlView)
DISP_FUNCTION(CChildView, "init", OnloadComplete, VT_EMPTY, VTS_NONE)
DISP_FUNCTION(CChildView, "function01", Function01, VT_EMPTY, VTS_R8 VTS_R8 VTS_R8)
END_DISPATCH_MAP()
// Onload完成
void CChildView::OnloadComplete()
{
}
void CChildView::Function01(double dCenterLong, double dCenterLat, double dZoomLevel)
{
}
// javascript调用
if (typeof(window.external) != "undefined"){
if(typeof(window.external.init) != "undefined"){
try{
window.external.init();
}catch(e){
// alert(e);
}
}
}
/*****************************工程中调用js****************************/
// 执行javascript
BOOL CChildView::ExecJavascript(CStringW& strFunction)
{
IHTMLDocument2 *pHDoc2 = (IHTMLDocument2 *)GetHtmlDocument();
if (pHDoc2 !=NULL)
{
IHTMLElementCollection * all = NULL;
pHDoc2->get_all(&all);
IHTMLWindow2 *p=NULL;
HRESULT hr = pHDoc2->get_parentWindow(&p);
if (SUCCEEDED(hr) && p != NULL)
{
VARIANT varRtn;
BSTR code = ::SysAllocString(strFunction);
BSTR language = ::SysAllocString(L"javascript");
p->execScript(code, language, &varRtn);//执行网页函数
VariantClear(&varRtn);
return TRUE;
}
}
return FALSE;
}