最近项目用到浏览插件的开发,IE用到的是BHO,chrome打算做成扩展。

但是和ie有一点不同,chrome扩展是基于html+js+css开发的,那么就会有二个问题

1. 代码和算法等容易被别人复制和盗用。

2. 有部份功能需要用native code来实现。

所以仅仅使用chrome扩展是不够的。后来想到了native client,但是这个需要在chrome://flags/中开启相应的设置。而且也不是很安全。

最后选择了chrome的native messaging,原理我就不多说了,这里只介绍如何实现。

chrome扩展中,manifest.json有几点要注意

"background": {
"scripts": [
"res/js/background.js"
]
},

上面个background.js,是必须要加的,后面会介绍原因

"content_scripts": [
{
"all_frames": false,
"css": [
],
"js": [
"res/js/contentscript.js"
],
"matches": [
"http://*/*",
"https://*/*"
],
"run_at": "document_end"
}
],

这个表示在页面加载结束时调用contentscript.js

"permissions": [
"nativeMessaging"
],

权限别忘了加上。

contentscript.js中,只有一段代码

$(function () {

chrome.extension.sendRequest("this is a request");

});

重点在background.js中了,不多说,贴代码

var port;

function onDisconnected() {

port = null;

}

function onNativeMessage(message) {

alert(JSON.stringify(message));

}

function connect() {

port = chrome.runtime.connectNative('com.beeper2g.demo.nativemessage');

port.onMessage.addListener(onNativeMessage);

port.onDisconnect.addListener(onDisconnected);

}

chrome.extension.onRequest.addListener(function(data, sender) {

if (data.length > 0) {

connect();

port.postMessage(data);

}

});

注意方法 chrome.runtime.connectNative 是属于content script,这个不能在页面中调用,所以只能放在backgroud.js中,上面提到过。

扩展中的东西就这么些,讲一下注册以及调用方式

注册和解注册就是在注册表中添加相应的值就OK了,发二个bat,一个install,一个uninstall

install.bat内容为

:: %~dp0 is the directory containing this bat script and ends with a backslash.

REG ADD "HKCU\Software\Google\Chrome\NativeMessagingHosts\com.beeper2g.demo.nativemessage" /ve /t REG_SZ /d "%~dp0com.beeper2g.demo.nativemessage.json" /f

uninstall.bat内容为

:: Deletes the entry created by install_host.bat

REG DELETE "HKCU\Software\Google\Chrome\NativeMessagingHosts\com.beeper2g.demo.nativemessage" /f

其中的com.beeper2g.demo.nativemessage.json中内容十分简单

{

"name": "com.beeper2g.demo.nativemessage",

"description": "Demo程序",

"path": "X:\XXX\chromeService.exe",

"type": "stdio",

"allowed_origins": [

"chrome-extension://fkdejdpefhhjdjdlmalkegclifdofipm/"

]

}

字段自己去对应,path为绝对路径。chrome-extension://fkdejdpefhhjdjdlmalkegclifdofipm/ 中的id别忘了与扩展一致

c++部份

// chromeHost.cpp : Defines the entry point for the console application.

//

using namespace std;

void output(const string& str)

{

unsigned int len = str.length();

cout<< char(((len>>0) & 0xFF))

<< char(((len>>8) & 0xFF))

<< char(((len>>16) & 0xFF))

<< char(((len>>24) & 0xFF));

cout << str << endl;

}

string getInput()

{

string input;

unsigned int reqLen = 0;

cin.read(reinterpret_cast<char*>(&reqLen) ,4);

for (int i = 0; i < reqLen; i++) {

input += getchar();

}

return input;

}

int main(int argc, char* argv[]) {

string input = getInput();

MessageBoxA(NULL, input.c_str(), NULL, NULL);

output("this is response");

return 0;

}

重中之重就是注意通讯中都有四个字节的包头,表示包的大小,这个不能丢,否则不会成功。

Google chrome浏览器中通过扩展调用本地应用程序以及和程序相互通讯(C++)的更多相关文章

  1. Google Chrome浏览器中如何使用命令

    Google Chrome浏览器中如何使用命令 | 浏览:2974 | 更新:2014-02-23 23:12 | 标签:chrome 1 2 3 分步阅读 Google Chrome浏览器有很多的特 ...

  2. 将Chrome浏览器中的扩展程序导出为crx插件文件

    将Chrome浏览器中安装的插件程序导出为crx插件文件 以360急速浏览器为例进行导出crx插件程序 1.在Chrom商店中找到需要的插件,安装到浏览器的扩展程序里面()IDM Integratio ...

  3. Google Chrome浏览器插件入门开发

    --1. 在html文件中引用js 文件 --2.在Google Chrome中开发简单插件 1.首先,简单说明一下在html 中引用js 文件: 将kittenbook.html 和 kittenb ...

  4. 哇塞,原来自己写 Google Chrome 浏览器扩展(插件)这么容易!

    1. 首先新建一个记事本,命名为 manifest.json,这是写 Google Chrome 浏览器扩展必须的文件 { "manifest_version": 2, " ...

  5. 360chrome,google chrome浏览器使用jquery.ajax加载本地html文件

    使用360chrome和google chrome浏览器加载本地html文件时,会报错,提示: XMLHttpRequest cannot load file:///Y:/jswg/code/html ...

  6. CEF中文教程(google chrome浏览器控件) -- Windows下编译Chromium

    CEF中文教程(google chrome浏览器控件) -- CEF简介 2013-04-10 16:48 42928人阅读 评论(4) 收藏 举报  分类: CEF(2)    目录(?)[+]   ...

  7. 详解Google Chrome浏览器(操作篇)(下)

    开篇概述 由于最近忙于公司产品的架构与研发,已经三个多月没有写博客了,收到有些朋友的来信,问为什么不及时更新博客内容呢,他们说他们正期待着某些内容.对此,非常抱歉,那么我在此也给各位朋友一些承诺,从即 ...

  8. 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  9. 详解Google Chrome浏览器(操作篇)(上)

    开篇概述 在上篇博客中详解Google Chrome浏览器(理论篇)一文中,主要讲解了Chrome 搜索引擎使用.Chrome安装和基本操作.Chrome 基本架构.多线程等原理性问题,这篇将重点讲解 ...

随机推荐

  1. [国嵌攻略][148][MTD系统架构]

    MTD设备概述 Flash在嵌入式系统中是必不可少的,它是bootloader.Linux内核和文件系统的最佳载体.在Linux内核中引入了MTD子系统为NOR Flash和Nand FLash设备提 ...

  2. 使用layui在规定的期限内选择日期

    这几天碰到了layui中的日期与时间这个,本以为很简单的,可是又一个需求是这样的,有两个日期选择框,第一个日期选择框要求最小日期不得小于当前日期,第二个日期选择框要求最小日期为第一个日期选择框的选中日 ...

  3. 十二个 ASP.NET Core 例子——过滤器

    目录: 过滤器介绍 过滤器类别 自定义过滤器和过滤特性 直接短路返回内容 过滤器与中间件的区别 如果要全局日志,不要用过滤器 官方文档传送门 1.过滤器介绍 没有权限直接返回,资源缓存,Action执 ...

  4. ASP.NET网络爬虫小研究 HtmlAgilityPack基础,爬取数据保存在数据库中再显示再自己的网页中

    1.什么是网络爬虫 关于爬虫百度百科这样定义的:网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些 ...

  5. Struts2------Result处理&获取页面请求参数&API

    一.Result处理 1.1 说明 平常我们设置跳转页面,是在action标签里面加上 result标签来控制,这种设置的页面跳转,称之为 局部结果页面:但是我们有时候在很多个action里面,针对不 ...

  6. 【开发技术】常用正则表达式大全!(例如:匹配中文、匹配html)

    匹配中文字符的正则表达式: [u4e00-u9fa5]   评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^x00-xff] 评注:可以用来计算字符串的长度 ...

  7. Ajax常用实例

    摘录自:http://www.cnblogs.com/gaopeng527/p/4459622.html 1. 级联下拉列表 例1.1 级联下拉列表. (1)编写AjaxRequest.js文件,并将 ...

  8. Java数据持久层框架 MyBatis之API学习十(Logging详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  9. Python3基础知识之元组、集合、字典

    1.元组 元组特点元组是不可变的两个元组可以做加法,不能做减法 元组的方法 >>> S('a', 'b', 'c', 'd', 'e')>>> S=('a','b' ...

  10. python-虎扑爬虫

    Python作为一个高级编程语言,不知从何时起就在圈子里流行起来了.个人也是图个鲜,跟上时代步伐学习了一下."鲁迅"说过:不能学以致用,就是耍流氓.我用python对虎扑论坛作了一 ...