Javascript 浏览器扩展与windows服务之间的通信

Javascript 浏览器扩展与windows服务之间的通信,javascript,c++,google-chrome-extension,middleware,Javascript,C++,Google Chrome Extension,Middleware,我有一个浏览器扩展(适用于chrome、Firefox、Edge),现在我想从扩展中查询一些信息到运行在同一台机器上的windows服务 我需要从扩展传递一些字符串,windows服务将处理这些字符串并返回处理后的字符串 我尝试过WebAssembly,但它不适合我们的需要,因为它是编译代码,不在后台运行。此外,服务中还有一些特定于windows的标头,web程序集不支持这些标头 那么,你知道我们如何才能做到这一点吗 我将非常感谢StackOverflow社区。您可以使用本机消息(/) 创建如下

我有一个浏览器扩展(适用于chrome、Firefox、Edge),现在我想从扩展中查询一些信息到运行在同一台机器上的windows服务

我需要从扩展传递一些字符串,windows服务将处理这些字符串并返回处理后的字符串

我尝试过WebAssembly,但它不适合我们的需要,因为它是编译代码,不在后台运行。此外,服务中还有一些特定于windows的标头,web程序集不支持这些标头

那么,你知道我们如何才能做到这一点吗


我将非常感谢StackOverflow社区。

您可以使用本机消息(/)

创建如下所示的可执行文件:

json\u对象处理\u字符串(std::string\u视图){
//示例代码
std::字符串结果(1000);
UINT sz;
HRESULT status=CallWindowsApi(s.data(),s.size(),result.data(),1000,&sz);
如果(失败(状态)){
返回my_json_library::dict({{“err”,my_json_library::integer(status)});
}
返回my_json_library::string(result.data(),sz);
}
int main(){
//确保stdin在二进制模式下打开,以读取该大小的原始字节
_setmode(_fileno(stdin),O_BINARY);
_setmode(_fileno(stdout),O_BINARY);
while(true){
//消息的前缀为4字节大小
标准:uint32_t尺寸;
{
字符大小_buf[4];
如果(标准::fread(尺寸为4,1,标准尺寸)!=1){
返回std::feof(stdin)?0:1;
}
标准::memcpy(&size,size_buf,4);
}
//后跟JSON的'size'字节
json_object obj=my_json_库::从_文件读取(标准输入,大小);
//处理接收到的消息
如果(!obj.is_string())返回1;
std::string_view s=obj.as_string();
json_对象结果_json=进程_字符串;
std::string result=result_json.stringify();
std::uint32_t result_size=result.size();
如果(结果大小>1024*1024){
//Chrome仅允许接收1MB消息
//(不确定是1000*1000(MB)还是1024*1024(MiB))
//如果您可能会遇到这种情况,请为
//将消息拆分为多个1MB块
}
//发送的消息也以大小作为前缀
if(std::fwrite(&result_size,4,1,stdout)!=1){
返回1;
}
//然后是JSON数据
if(std::fwrite(&result.data(),1,result\u size,stdout)!=result\u size){
返回1;
}
}
}
使用相关注册表项注册相关清单文件的路径(可能使用安装程序安装可执行文件和清单文件+注册表项)

从chrome扩展端调用相对简单:

let port=chrome.runtime.connectNative('com.my_company.my_application');
port.onMessage.addListener(函数(msg){
//处理收到的消息(可执行文件写入的内容)
如果(消息类型=='string'){
//成功
}否则{
//错误
const error_code=msg.err;
// ...
}
});
port.onDisconnect.addListener(函数(){
//处理崩溃(可能只是重新打开)
});
port.postMessage(“要转换的字符串”);
//可以发送任何json消息,但我们的可执行文件只处理字符串
或者每次都重新运行可执行文件(如果使用此选项,可以删除可执行文件中的循环):

chrome.runtime.sendNativeMessage('com.my\u company.my\u application',
“要转换的字符串”,
功能(msg){
//处理收到的消息(可执行文件写入的内容)
});


或者,您可以在执行此处理的任意(但不变)端口上运行HTTP服务器,您的web扩展只需将数据发布到
`http://localhost:${port}`
。您可能应该允许在配置中更改主机/端口。

您可以使用本机消息(/)

创建如下所示的可执行文件:

json\u对象处理\u字符串(std::string\u视图){
//示例代码
std::字符串结果(1000);
UINT sz;
HRESULT status=CallWindowsApi(s.data(),s.size(),result.data(),1000,&sz);
如果(失败(状态)){
返回my_json_library::dict({{“err”,my_json_library::integer(status)});
}
返回my_json_library::string(result.data(),sz);
}
int main(){
//确保stdin在二进制模式下打开,以读取该大小的原始字节
_setmode(_fileno(stdin),O_BINARY);
_setmode(_fileno(stdout),O_BINARY);
while(true){
//消息的前缀为4字节大小
标准:uint32_t尺寸;
{
字符大小_buf[4];
如果(标准::fread(尺寸为4,1,标准尺寸)!=1){
返回std::feof(stdin)?0:1;
}
标准::memcpy(&size,size_buf,4);
}
//后跟JSON的'size'字节
json_object obj=my_json_库::从_文件读取(标准输入,大小);
//处理接收到的消息
如果(!obj.is_string())返回1;
std::string_view s=obj.as_string();
json_对象结果_json=进程_字符串;
std::string result=result_json.stringify();
std::uint32_t result_size=result.size();
如果(结果大小>1024*1024){
//Chrome仅允许接收1MB消息
//(不确定是1000*1000(MB)还是1024*1024(MiB))
//如果您可能会遇到这种情况,请为
//将消息拆分为多个1MB块
}
//发送的消息也以大小作为前缀
if(std::fwrite(&result_size,4,1,stdout)!=1){
返回1;
}
//然后是JSON数据
if(std::fwrite(&result.data(),1,result\u size,stdout)!=result\u size){
返回1;
}
}
}
注册re的路径