在界面类.h添加
public:
virtual BOOL IsExternalDispatchSafe() { return TRUE; }
virtual void OnDocumentComplete(LPDISPATCH pDisp, LPCTSTR szUrl);
protected:
DECLARE_DISPATCH_MAP()
DECLARE_MESSAGE_MAP()
DECLARE_DHTML_EVENT_MAP()
public:
// 调用js函数
BOOL excute_javascript_funcion(const CString& javascript_fun_name, vector<CString>& parameters, VARIANT& ret);
BOOL excute_javascript_funcion(const CString& javascript_fun_name, vector<CString>& parameters);
BOOL excute_javascript_funcion(const CString& javascript_fun_name, VARIANT& ret);
BOOL excute_javascript_funcion(const CString& javascript_fun_name);
void on_create();
void test_function(VARIANT& vstr1, VARIANT& vStr2);
在界面类的.cpp中添加:
BEGIN_DISPATCH_MAP(clocale_appraise_dlg,CDHtmlDialog)
DISP_FUNCTION(clocale_appraise_dlg,"testfun",test_function,VT_EMPTY,VTS_VARIANT VTS_VARIANT) // 参数以空格分开
END_DISPATCH_MAP()
OnInitDialog()中添加
//
// 定位vtable指针
EnableAutomation();
SetExternalDispatch(GetIDispatch(TRUE));
BOOL clocale_appraise_dlg::excute_javascript_funcion(const CString &javascript_fun_name, vector<CString> ¶meters, VARIANT &ret)
{
IHTMLDocument2* pDoc;
HRESULT hr = GetDHtmlDocument(&pDoc);
if(!SUCCEEDED(hr))
{
return FALSE;
}
IHTMLWindow2* pWnd;
hr = pDoc->get_parentWindow(&pWnd);
if(!SUCCEEDED(hr))
{
return FALSE;
}
ret.vt = VT_EMPTY;
CString func;
if(parameters.empty())
{
func.Format(_T("%s()"),(LPCTSTR)javascript_fun_name);
}
else
{
func = javascript_fun_name;
func += _T("(");
for(vector<CString>::iterator iter = parameters.begin(); iter!=parameters.end(); ++iter)
{
func += _T("'");
func += *iter;
func += _T("'");
func += _T(",");
}
func = func.Mid(0,func.GetLength()-1);
func += _T(")");
}
hr = pWnd->execScript(func.AllocSysString(), _T("javascript"), &ret);
return SUCCEEDED(hr);
}
BOOL clocale_appraise_dlg::excute_javascript_funcion(const CString &javascript_fun_name, vector<CString> ¶meters)
{
VARIANT ret;
return excute_javascript_funcion(javascript_fun_name,parameters,ret);
}
BOOL clocale_appraise_dlg::excute_javascript_funcion(const CString& javascript_fun_name, VARIANT& ret)
{
vector<CString> param;
return excute_javascript_funcion(javascript_fun_name,param,ret);
}
BOOL clocale_appraise_dlg::excute_javascript_funcion(const CString& javascript_fun_name)
{
VARIANT ret;
return excute_javascript_funcion(javascript_fun_name,ret);
}
void clocale_appraise_dlg::on_create()
{
excute_javascript_funcion(_T("createTree()")); // 调用js的createTree函数
}
// 表示加载页面完成后做的动作
void clocale_appraise_dlg::OnDocumentComplete(LPDISPATCH pDisp, LPCTSTR szUrl)
{
on_create();
}
// 供js调用
void clocale_appraise_dlg::test_function(VARIANT& vstr1, VARIANT& vstr2)
{
CComVariant varstr1(vstr1), varstr2(vstr2);
varstr1.ChangeType(VT_BSTR);
varstr2.ChangeType(VT_BSTR);
USES_CONVERSION;
CString strmsg;
strmsg.Format(_T("varstr1:%s,varstr2:%s"),OLE2T(varstr1.bstrVal),OLE2T(varstr2.bstrVal));
AfxMessageBox(strmsg);
}
public:
virtual BOOL IsExternalDispatchSafe() { return TRUE; }
virtual void OnDocumentComplete(LPDISPATCH pDisp, LPCTSTR szUrl);
protected:
DECLARE_DISPATCH_MAP()
DECLARE_MESSAGE_MAP()
DECLARE_DHTML_EVENT_MAP()
public:
// 调用js函数
BOOL excute_javascript_funcion(const CString& javascript_fun_name, vector<CString>& parameters, VARIANT& ret);
BOOL excute_javascript_funcion(const CString& javascript_fun_name, vector<CString>& parameters);
BOOL excute_javascript_funcion(const CString& javascript_fun_name, VARIANT& ret);
BOOL excute_javascript_funcion(const CString& javascript_fun_name);
void on_create();
void test_function(VARIANT& vstr1, VARIANT& vStr2);
在界面类的.cpp中添加:
BEGIN_DISPATCH_MAP(clocale_appraise_dlg,CDHtmlDialog)
DISP_FUNCTION(clocale_appraise_dlg,"testfun",test_function,VT_EMPTY,VTS_VARIANT VTS_VARIANT) // 参数以空格分开
END_DISPATCH_MAP()
OnInitDialog()中添加
//
// 定位vtable指针
EnableAutomation();
SetExternalDispatch(GetIDispatch(TRUE));
BOOL clocale_appraise_dlg::excute_javascript_funcion(const CString &javascript_fun_name, vector<CString> ¶meters, VARIANT &ret)
{
IHTMLDocument2* pDoc;
HRESULT hr = GetDHtmlDocument(&pDoc);
if(!SUCCEEDED(hr))
{
return FALSE;
}
IHTMLWindow2* pWnd;
hr = pDoc->get_parentWindow(&pWnd);
if(!SUCCEEDED(hr))
{
return FALSE;
}
ret.vt = VT_EMPTY;
CString func;
if(parameters.empty())
{
func.Format(_T("%s()"),(LPCTSTR)javascript_fun_name);
}
else
{
func = javascript_fun_name;
func += _T("(");
for(vector<CString>::iterator iter = parameters.begin(); iter!=parameters.end(); ++iter)
{
func += _T("'");
func += *iter;
func += _T("'");
func += _T(",");
}
func = func.Mid(0,func.GetLength()-1);
func += _T(")");
}
hr = pWnd->execScript(func.AllocSysString(), _T("javascript"), &ret);
return SUCCEEDED(hr);
}
BOOL clocale_appraise_dlg::excute_javascript_funcion(const CString &javascript_fun_name, vector<CString> ¶meters)
{
VARIANT ret;
return excute_javascript_funcion(javascript_fun_name,parameters,ret);
}
BOOL clocale_appraise_dlg::excute_javascript_funcion(const CString& javascript_fun_name, VARIANT& ret)
{
vector<CString> param;
return excute_javascript_funcion(javascript_fun_name,param,ret);
}
BOOL clocale_appraise_dlg::excute_javascript_funcion(const CString& javascript_fun_name)
{
VARIANT ret;
return excute_javascript_funcion(javascript_fun_name,ret);
}
void clocale_appraise_dlg::on_create()
{
excute_javascript_funcion(_T("createTree()")); // 调用js的createTree函数
}
// 表示加载页面完成后做的动作
void clocale_appraise_dlg::OnDocumentComplete(LPDISPATCH pDisp, LPCTSTR szUrl)
{
on_create();
}
// 供js调用
void clocale_appraise_dlg::test_function(VARIANT& vstr1, VARIANT& vstr2)
{
CComVariant varstr1(vstr1), varstr2(vstr2);
varstr1.ChangeType(VT_BSTR);
varstr2.ChangeType(VT_BSTR);
USES_CONVERSION;
CString strmsg;
strmsg.Format(_T("varstr1:%s,varstr2:%s"),OLE2T(varstr1.bstrVal),OLE2T(varstr2.bstrVal));
AfxMessageBox(strmsg);
}