最近修改老旧的MFC项目,用的网页做界面,和HTML交互采用的是COM方式,繁琐,丑陋又性能低下,于是考虑利用js来进行界面交互,查了一天的资料,现在整理如下,供后来需要的人参考,虽然大概几乎不会有人用MFC来做项目了(笑),用winform或者WPF或者网页做界面,高性能部分用C++封装的dll也许是更好的选择,当然直接在exe里面提供http访问接口是最吼的(go语言赛高)!界面这个是比较大的话题,可以开个专题慢慢说了。。。

核心的一个CWebPage类是一个老外写的,封装了js的COM操作,用来和webbrowser进行js调用,但是只能调用已经存在的js代码,有时需要自己向网页注入一些js函数(你懂的),你可以在一个空白页上面,用js生成整个页面。

    IHTMLDocument2* pHTMLDoc = (IHTMLDocument2*)web.get_Document();
if(pHTMLDoc != NULL)
{
IHTMLWindow2* pHTMLWnd;
pHTMLDoc->get_parentWindow( &pHTMLWnd );
if (pHTMLWnd != NULL)
{
CString js_code;
js_code="function test(str){ alert(str);return str;}";//此次为实际写入的javascript代码
//js_code.Format(L"goToLocation('%s');",JScode);//JS函数名+参数
VARIANT ret;
pHTMLWnd->execScript(js_code.AllocSysString(), L"Javascript", &ret);//执行javascript代码
pHTMLWnd->Release(); CWebPage page;
page.SetDocument(web.get_Document());
CComVariant varResult;
page.CallJScript("test","",&varResult);
MessageBox(CString(varResult.bstrVal));
}
pHTMLDoc->Release();
}

先向网页注入(这样听上去比较高大上)一个js函数(代码只是方法之一,还有其他的方法就不列举了),然后通过webpage封装的方法调用函数并返回值,这样做的会比C++用COM接口操作网页简单而且速度更快(并没有测试,理论上应该是这样)

这里只是解决MFC调用js,js调用MFC比较复杂也就没有去深入,COM这种东西感觉真的是上古遗物了,项目里使用的是截获网页的跳转地址来判断需要进行的操作,基本上已经足够了,记得winform里的webbrowser和js互相调用是将对象封装成一个com对象暴露给webbrowser。

源码:下载

MFC与Webbrower交互(通过JS)的更多相关文章

  1. aspx 页面中 js 引用与页面后台的数据交互 --【 js 调后台】

    后台调用 js 方法 前台调用后台方法与变量:  后台被调用的方法必须是public 或 protected 后台被调用的方法必须是静态的static 方法一:通过WebService来实现 步骤: ...

  2. JS与OC交互,JS中调用OC方法(获取JSContext的方式)

    最近用到JS和OC原生方法调用的问题,查了许多资料都语焉不详,自己记录一下吧,如果有误欢迎联系我指出. JS中调用OC方法有三种方式: 1.通过获取JSContext的方式直接调用OC方法 2.通过继 ...

  3. 小程序组件交互 -- 传入js

    1.父组件(wxml页面)向子组件传递 在子组件中定义需要传入的属性 properties: { count: { type: Number, value: 0, observer:function( ...

  4. WinForm程序执行JS代码的多种方法以及使用WebBrowser与JS交互

    方法一 使用微软官方组件Interop.MSScriptControl 1.msscript.ocx下载的地址   http://www.microsoft.com/downloads/details ...

  5. 关于FlexPaper 2.1.2版本 二次开发 Logo 、打印、搜索、缩略图、添加按钮、js交互、右键菜单、书签等相关问题

    2015-03-02 更新文章,由于需求修改,更改了flexpaper插件,故增加第9.10.11小节,下载代码时请注意. 先废话几句.最近用到文档在线浏览功能,之前用的是print2flash(一个 ...

  6. js 与 ios Android交互

    一.android 交互 1.js调用webview 在android API Level 17及以上的版本中,就会出现js调用不了android的代码,这是版本兼容的问题,需要在调用的方法上面加一个 ...

  7. 第4章-Vue.js 交互及实例的生命周期

    一.学习目标 了解实例生命周期的过程 理解钩子函数的作用 掌握Vue.js过滤器的使用方法 (重点) 能够使用网络请求进行前后端交互 (重点.难点) 二.交互的基本概念 2.1.前端和后端的概念 说明 ...

  8. Android 中 js 和 原生交互

    Android中的WebView 中加载的URL 默认是在手机浏览器中加载的,我们可以覆盖这种默认的动作,让网页在WebView中打开.通过设置WebView的WebViewClent 达到这个效果. ...

  9. Qtl和JS、HTML通信/交互

    http://www.cnblogs.com/sigma0/p/7346727.html Qt的QWebChannel和JS.HTML通信/交互驱动百度地图 0 前言 我一个研究嵌入式的,不知道怎么就 ...

随机推荐

  1. BZOJ 3895: 取石子[SG函数 搜索]

    有N堆石子 ·从某堆石子中取走一个 ·合并任意两堆石子 不能操作的人输. 100%的数据满足T<=100,  N<=50. ai<=1000   容易发现基础操作数$d=\sum a ...

  2. BZOJ 2809: [Apio2012]dispatching [主席树 DFS序]

    传送门 题意:查询树上根节点值*子树中权值和$\le m$的最大数量 最大值是多少 求$DFS$序,然后变成区间中和$\le m$最多有几个元素,建主席树,然后权值线段树上二分就行了 $WA$:又把边 ...

  3. 基本的socket编程的介绍

    网络IPC:套接字 用socket实现两个不同的主机之间的通信(涉及到一些基本的计算机网络知识  略过..) 服务器端: 1.socket函数:生成一个套接字 int socket(int domai ...

  4. 基于jq的表单填充

    //表单填充 formDataLoad: function (domId, obj) { for (var property in obj) { if (obj.hasOwnProperty(prop ...

  5. eslint规则

    碰到eslint报错, 把错误的提示拷贝在这里Ctrl + F找到复制到eslint.js里面就行了. "off"或者0,不启用这个规则 "warn"或者1,出 ...

  6. 浅谈PHP答题卡识别(一)

    最近期末考试考完了,我们也要放寒假了.于是突发奇想,想用PHP写一个答题卡识别程序.已经实现了一些,现分享给大家. 具体的步骤如下: 上传答题卡=>图片二值化(已实现)=>寻找定位点(已实 ...

  7. lasy load图片的实现

    无意中看到了这篇关于使用LQIP(Low Quality Image Placeholders) 原文链接,方案实现图片加载优化方案.在此实践一把. 1. 方案实现 页面初始化时,img元素初始化时, ...

  8. 基于JDK1.8的LinkedList剖析

    之前写了一篇ArrayList,那么今天就写一篇他的姊妹篇,LinkedList. 众所周知,ArrayList底层数据是数组,可以在O(1)的时间内get到数据,但删除和插入就要O(n)时间复杂度. ...

  9. 老男孩Python全栈开发(92天全)视频教程 自学笔记09

    day9课程内容: 乌班图(ubuntu)64位系统 和 VMware 虚拟机安装(官网收费又麻烦,在网上找资源 安装vmware: vm运行(秘钥找度娘)--文件--新建虚拟机--自定义 下一步-- ...

  10. hdu 2553 N皇后

    这题要打表,不然超时. AC代码 #include<cstdio> #include<cstring> int n,cnt; int vis[3][20]; int ans[1 ...