MFC 框架 CHtmlDialog中 javaSript 的调用

来源:互联网 发布:百度算法之轮流展现法 编辑:程序博客网 时间:2024/05/22 03:30


相关函数与结构:

  • 函数
    • GetDHtmlDocument
    • execScript
    • get_parentWindow
    • GetIDsOfNames
    • Invoke
  • 结构体:
    • VARIANT(用于传递参数)

方法一(不在乎 js 函数的返回值):

复制代码
IHTMLDocument2* pDocument; IHTMLWindow2* pWindow; //获得 html 的 Document 节点HRESULT hr = GetDHtmlDocument(&pDocument);//获得 Document 的窗口节点pDocument->get_parentWindow(&pWindow); VARIANT ret; ret.vt = VT_EMPTY;pWindow->execScript(AllocSysString("jsfunc()"),L"JavaScript",&ret);//清理工作,释放 Document 和 window节点pDocument->Release();pWindow->Release();
复制代码

方法二(需要获得 js 函数的返回值):

复制代码
IHTMLDocument2* pDocument; IHTMLWindow2* pWindow; DISPPARAMS dispparams;//用于给 JS 传递参数对象DISPID dispid;EXCEPINFO excepInfo;//获取JS中异常的对象CComVariant vaResult;//JS返回的结果值对象//获得 html 的 Document 节点及 Document 对应的窗口节点GetDHtmlDocument(&pDocument); pDocument->get_parentWindow(&pWindow); //初始化JS所用的参数对象,JS中异常的对象memset(&dispparams, 0, sizeof dispparams);memset(&excepInfo, 0, sizeof excepInfo);//设置参数个数,并开辟参数空间dispparams.cArgs=2;dispparams.rgvarg = new VARIANT[dispparams.cArgs];//设置每个参数的类型dispparams.rgvarg[0].vt = VT_BSTR;dispparams.rgvarg[1].vt = VT_BSTR;//为参数赋值CComBSTR fromMFC1=_T("one");CComBSTR fromMFC2=_T("two");fromMFC2.CopyTo(&dispparams.rgvarg[1].bstrVal);fromMFC1.CopyTo(&dispparams.rgvarg[0].bstrVal);UINT nArgErr = (UINT)-1;CComBSTR szMember = _T("CalledJs");pWindow->GetIDsOfNames(IID_NULL, &szMember,1,LOCALE_SYSTEM_DEFAULT,&dispid); pWindow->Invoke(dispid, IID_NULL, 0, DISPATCH_METHOD, &dispparams, &vaResult, &excepInfo,&nArgErr);//显示 JS 返回的结果CString str(vaResult.bstrVal);this->MessageBox(str);//清理工作,释放 Document 和 window 节点pDocument->Release();pWindow->Release();
复制代码

javascript 调用 C++

相关函数及宏链接到 MSDN:

  • EnableAutomation
  • SetExternalDispatch
  • DECLARE_DISPATCH_MAP
  • BEGIN_DISPATCH_MAP
  • DISP_FUNCTION
  • END_DISPATCH_MAP

步骤:

  • 让 CTestHtmlDialog 支持自动化,即在 OnInitDialog() 中添加 
    EnableAutomation();
  • 将自身暴露给 Javascript ,即在 OnInitDialog() 中添加
    SetExternalDispatch(GetIDispatch(TRUE)); //将浏览器控件的扩展接口设置为对话框自身的 IDispatch
  • 声明 DISPATCH_MAP,即在 TestHtmlDialog.h 中声明对应映射
    DECLARE_DISPATCH_MAP()
  • 定义对应的 C++ 函数,用于给 Javascript 调用
    void func(){    MessageBox(L"hello!");}
  • 定义DISPATCH_MAP,和添加对应函数映射,即在 TestHtmlDialog.cpp 中 
    BEGIN_DISPATCH_MAP(CMyDHtmlDialog, CDHtmlDialog) DISP_FUNCTION(CMyDHTMLDialog, "SayHello", func, VT_EMPTY, VTS_NONE) END_DISPATCH_MAP()
  • 取消JS在调用 C++ 时的提醒框,即在 CTestHtmlDialog 中,重载 CanAccessExternal() 函数
    BOOL CWebbrowserDlg::CanAccessExternal() {   return TRUE; }
  • 在 Javascript 中调用 C++ 函数
    function Button1_onclick() {     //调用 C++ 的 func,函数     external.SayHello(); }

源地址http://www.cnblogs.com/kzloser/archive/2012/12/02/2798556.html

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 签证做假工作证明资料被拒怎么办 在广州办个建设厅电工证怎么办 水利考的五大员证到有效期怎么办 额头注射玻尿酸吸收后不平怎么办 施工员证书挂靠拿不回来怎么办 森林公安未转政法编制的人员怎么办 北京的限行新政策外地车怎么办 报考二级建造师工作年限不够怎么办 郑州航院图书馆密码忘了怎么办 无锡妇幼预约挂号过号了怎么办 云南建筑八大员考试没通过怎么办 订车ax7一个月提不到车怎么办 提车时间到了却没车怎么办 一汽大众速腾气囊灯亮该怎么办呢? 幼儿园上课时候电脑上的课件怎么办 黑米紫薯红豆粥不好煮怎么办 母狗生了小狗后不吃东西没奶怎么办 狗给扑倒了主人不想负责怎么办 山东政务网个人中心账号忘了怎么办 网易博客忘记登入名和密码了怎么办 奶水不够怎么办怎样让奶水变多 和初恋分手多年又爱上初恋该怎么办 分手六年的初恋想要和我复合怎么办 不小心把手机里的视频删了怎么办 网签过了中介不配合过户怎么办 房屋被中介恶意网签了怎么办 重介质选矿块矿品位低怎么办 去泰国酒吧选小姐只会说中文怎么办 脚被窝烫伤后发炎里面有龙怎么办 脚被窝烫了发炎有龙怎么办 辣椒落花的药喷到孩子嘴巴了怎么办 香炉里的小米生虫子了怎么办 香炉里面放的小米生虫子了怎么办 肉肉上长满了白色的小虫子怎么办 多肉上面有白色的虫子怎么办 多肉植物根部长白色虫子怎么办 朋友玩期货把我钱赔了怎么办 宝宝床上虫子咬了肿大包怎么办 喷药的杀虫剂的喷头坏了怎么办 宅e经营贷个人没有公司怎么办 浏览器下载完插件安装不好用怎么办