chrome浏览器自从去年以来逐步去掉了对浏览器插件的支持,npapi的方案马上不可用。 当务之急要选择一个替代方案,最常用的就是扩展了。扩展程序提供了一套和本地程序交互的方案——“原生消息通信”

写本地应用的工具和语言很多,比如:C#,C++,phyon 都可以,本人对delphi熟悉一点,就说说delphi怎么接收和发送消息的吧。

Chrome扩展对原生消息通信有非常明确的说明

Chrome 浏览器在单独的进程中启动每一个原生消息通信宿主,并使用标准输入(stdin)与标准输出(stdout)与之通信。向两个方向发送消息时使用相同的格式:每一条消息使用 JSON 序列化,以 UTF-8 编码,并在前面附加 32 位的消息长度(使用本机字节顺序)。

怎么做呢? 

1、background.js中定义消息

var nativeHostName='com.xxx.mytest';
//chrome与本地程序通信的桥梁,根据该名称进行配置项的寻找。windows下在注册表HKEY_CURRENT_USER\Software\Google\Chrome\NativeMessagingHosts内寻找,linux下在目录/etc/opt/chrome/native-messaging-hosts/寻找该名称的json文件()
//native start
chrome.runtime.sendNativeMessage(nativeHostName,jsonData, function(response){
if (chrome.runtime.lastError){
console.log("lastError:" + chrome.runtime.lastError.message);
}
else{
console.log("recieved message: ", response.message);
}
});

2、新建一个Delphi控制台程序,添加标出输入和标准输出接口即可

  接收数据的标准输入

function ReadInputJson():WideString;
var
strmInput: THandleStream;
LBuffer: TBytes;
resLen:Integer;
sData: string;
begin strmInput := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE));
try
SetLength(LBuffer, );
strmInput.ReadBuffer(Pointer(LBuffer)^,);
resLen:= PInteger(LBuffer)^; SetLength(sData, resLen);
strmInput.Read(sData[], resLen);
Result := UTF8Decode(sData);
finally
strmInput.Free;
end; end;

  返回数据的标准输出

procedure WriteOutputJson(const str:String);
var strmOut: THandleStream;
len:Integer;
json:String;
begin
json:=UTF8Encode(str);
len:=Length(json); strmOut := THandleStream.Create(GetStdHandle(STD_OUTPUT_HANDLE));
try
strmOut.Write(len,);
strmOut.Write(PChar(json)^, len);
finally
strmOut.Free;
end; end;

主要是处理UTF8编码和前32位长度,非常容易出错。

  

让delphi解析chrome扩展的native应用的更多相关文章

  1. Chrome 扩展机制

    据说,今年9月份开始,谷歌将在Chrome浏览器中全面禁用NPAPI插件,Chrome 45以后将无法再加载NPAPI插件,并推出了一种新的机制:扩展. 其实,如果把浏览器看作一块画布的话,NPAPI ...

  2. 清除页面广告?身为前端,自己做一款简易的chrome扩展吧

    大家肯定有这样的经历,浏览网页的时候,左右两端广告,诸如“屠龙宝刀,点击就送”,以及最近火的不行的林子聪37传奇霸业什么“霸业面具,霸业吊坠”的魔性广告总是充斥我们的眼球. 当然有现成的扩展程序或者插 ...

  3. 一起来做chrome扩展《本地存储localStorage》

    chrome中的本地存储其实也是用的HTML5中localStorage,唯一区别是chrome扩展有自己的localStorage,它属于这个扩展,而不属于一个域名.得用这一点可以很好的处理扩展自己 ...

  4. Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  5. 实现chrome扩展启动本地进程 - 补充

    实现chrome扩展启动本地进程 - 补充 标签: chrome扩展启动本地程序访问本地磁盘 2014-10-17 11:42 6753人阅读 评论(17) 收藏 举报  分类: Chrome Plu ...

  6. Chrome扩展开发之一——Chrome扩展的文件结构

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  7. 【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序

    关于 chrome 扩展的文章,很久之前也写过一篇.清除页面广告?身为前端,自己做一款简易的chrome扩展吧. 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点. 什么是 chrome 扩展 ...

  8. 那些离不开的 Chrome 扩展插件

    虽然Chrome浏览器是个吃内存的怪兽,但是,它却因为启动速度.调试功能等成为了程序猿的必备浏览器!今天有时间,整理一下自己最常用的一些Chrome扩展吧: 常用网页浏览非开发类扩展: Tamperm ...

  9. ----转载----【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序

    关于 chrome 扩展的文章,很久之前也写过一篇.清除页面广告?身为前端,自己做一款简易的chrome扩展吧. 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点. 什么是 chrome 扩展 ...

随机推荐

  1. Ubuntu 14.04 (32位)上搭建Hadoop 2.5.1单机和伪分布式环境

    引言 一直用的Ubuntu 32位系统(准备下次用Fedora,Ubuntu越来越不适合学习了),今天准备学习一下Hadoop,结果下载Apache官网上发布的最新的封装好的2.5.1版,配置完了根本 ...

  2. plupload简易应用 多图片上传显示预览以及删除

    <script> var uploader = new plupload.Uploader({ //实例化一个plupload上传对象 browse_button: 'btnBrowse' ...

  3. linux特殊符号大全

    #   ;   ;;      .      ,       /       \       'string'|       !   $   ${}   $?      $$   $*  " ...

  4. linux sudo命令

    Sudo”是Unix/Linux平台上的一个非常有用的工具,它允许系统管理员分配给普通用户一些合理的“权利”,让他们执行一些只有超级用户或其他 特许用户才能完成的任务,比如:运行一些像mount,ha ...

  5. Android开源框架——Picasso

    开篇——介绍Picasso (Picasso是什么?)Picasso:A Powerfull Image Downloading and Caching Library for Android,即An ...

  6. Java学习笔记 第一章 入门<转>

    第一章 JAVA入门 一.基础常识 1.软件开发 什么是软件? 软件:一系列按照特定顺序组织的计算机数据和指令的集合 系统软件:DOS,Windows,Linux 应用软件:扫雷.QQ.迅雷 什么是开 ...

  7. JS手机端去除默认自带的选择复制菜单

    在需要的div上添加以下控制-webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: ...

  8. 【二分答案】【贪心】bzoj3969

    http://www.cnblogs.com/mmlz/p/4497118.html #include<cstdio> #include<algorithm> using na ...

  9. C++字符转码

    wchar_t* U8ToUnicode(char* szU8) { //UTF8 to Unicode //由于中文直接复制过来会成乱码,编译器有时会报错,故采用16进制形式 //char* szU ...

  10. media query学习笔记

    原文转自:http://blog.csdn.net/renfufei/article/details/19981133 http://www.cnblogs.com/softlover/archive ...