chrome 本机消息传递:本机主机可执行文件可以以参数开头吗?

chrome native messaging: can a native host executable start with arguments?

是否可以使用 main(int argc, char** argv) 参数启动本机主机?写成background.js比较合理,但是没有chrome.runtime.connectNative(string application, string[] arguments)这样的api。只有chrome.runtime.connectNative(字符串应用).

据我所知,您希望做的最好的事情就是创建一个 .bat 文件(或等效文件)并从那里传递参数。如果您有想要从扩展程序传递的动态数据(您不能将其硬编码到启动器脚本文件中),那么您将需要开发一个协议来启动启动序列以确保您的参数已被处理,例如

   var startupDone = false,
       port = chrome.runtime.connectNative( 'my.native.app' );

   port.onMessage.addListener( function( msg ) { 
      if ( msg.type === 'startupResponse' && msg.done ) startupDone = true;
      else {
         // process normal messages
      }
   } );
   port.postMessage( { type: 'startupRequest', params: [] } );
   ...
   if ( startupDone ) {
      port.postMessage( /* non-startup message */ );
   }

我假设你的可执行文件是 jar 并且它是第三方 jar,那么下面的内容可能会有所帮助,否则重写 jar 以接受 postMessage 可能是最好的解决方案

  1. 创建自定义 URI 并使其命中单独的 bat 文件
  2. 从后台脚本中调用它
  3. 在 bat 中创建一个记事本文件并复制您的参数或用参数覆盖您的可执行 bat 文件
  4. connectNative 到可执行文件 bat,它将使用参数启动 jar 或从记事本文件中获取它

如果您的参数是动态的,您可以创建一个充当中间人的小型启动器本机应用程序。它接受您的 Chrome 扩展程序发送的参数,并使用这些参数启动主要的本机应用程序。当主应用程序启动时,扩展程序可以与其交换消息。

如果在上面的场景中与主原生应用程序交换消息有任何问题(我从未尝试过),你可以将更多的责任交给启动器应用程序,让它在主应用程序之间来回传递消息本机应用程序和您的扩展程序。