chrome瀏覽器自從去年以來逐步去掉了對瀏覽器插件的支持,npapi的方案立刻不可用。 當務之急要選擇一個替代方案,最經常使用的就是擴展了。擴展程序提供了一套和本地程序交互的方案——「原生消息通訊」linux
寫本地應用的工具和語言不少,好比:C#,C++,phyon 均可以,本人對delphi熟悉一點,就說說delphi怎麼接收和發送消息的吧。chrome
Chrome擴展對原生消息通訊有很是明確的說明json
Chrome 瀏覽器在單獨的進程中啓動每個原生消息通訊宿主,並使用標準輸入(stdin)與標準輸出(stdout)與之通訊。向兩個方向發送消息時使用相同的格式:每一條消息使用 JSON 序列化,以 UTF-8 編碼,並在前面附加 32 位的消息長度(使用本機字節順序)。
怎麼作呢? windows
一、background.js中定義消息api
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); } });
二、新建一個Delphi控制檯程序,添加標出輸入和標準輸出接口便可瀏覽器
接收數據的標準輸入ide
function ReadInputJson():WideString; var strmInput: THandleStream; LBuffer: TBytes; resLen:Integer; sData: string; begin strmInput := THandleStream.Create(GetStdHandle(STD_INPUT_HANDLE)); try SetLength(LBuffer, 4); strmInput.ReadBuffer(Pointer(LBuffer)^,4); resLen:= PInteger(LBuffer)^; SetLength(sData, resLen); strmInput.Read(sData[1], 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,4); strmOut.Write(PChar(json)^, len); finally strmOut.Free; end; end;
主要是處理UTF8編碼和前32位長度,很是容易出錯。編碼