Windows 上 UWP 应用与其配套浏览器扩展之间的本机消息传递

如何解决Windows 上 UWP 应用与其配套浏览器扩展之间的本机消息传递

背景

我有一个 UWP 应用程序,它在其私有数据文件夹中写入数据。

我需要能够从浏览器扩展中读取该数据。

我目前的方法

我在我的解决方案中添加一个新的 C++ 项目,该项目可以使用标准输入和标准输出通过我的浏览器扩展执行二进制本机消息传递。

供您参考,浏览器扩展助手的代码

#include "pch.h"

#include <string>
#include <iostream>
#include <fcntl.h>
#include <io.h>

#ifdef _WIN32
#include <Windows.h>
#else
#include <unistd.h>
#endif


void writeResponse(std::string response) {
    unsigned int length = response.length();
    std::cout.write(reinterpret_cast<const char*>(&length),4);
    std::cout << response << std::flush;
}

std::string readInputMessage() {
    bool hasFetchedInput = false;
    do {
        char rawInputLength[4];
        std::cin.read(rawInputLength,4);
        unsigned int inputLength = *reinterpret_cast<unsigned int*>(rawInputLength);
        if (inputLength < 1024 && inputLength>1)
        {
            hasFetchedInput = true;
            char* input = new char[inputLength];
            memset(input,inputLength + 1);
            std::cin.read(input,inputLength);
            std::string inputMessage(input);
            delete[] input;
            return inputMessage;
        }
        else {
            Sleep(1000);
        }
    } while (!hasFetchedInput);
}

std::string handleMessage(std::string inputMessage) {
    // inputMessage and response must always be stringified objects
    std::string copy = inputMessage;
    std::string response = "{\"hello\":\"world\"}";
    return response;
}

int main()
{
    _setmode(_fileno(stdin),_O_BINARY);
    _setmode(_fileno(stdout),_O_BINARY);
    std::string inputMessage = readInputMessage();
    std::string response = handleMessage(inputMessage);
    writeResponse(response);
}

(我还没有对阅读文件部分进行编码)。

代码确实有效,并且能够在调试模式下与我的扩展程序进行通信。 为此,我还需要在注册表中添加一个

REG ADD "HKCU\Software\Microsoft\Edge\NativeMessagingHosts\myAppbrowserExtensionHelper" /ve /t REG_SZ /d "C:\Users\me\path\to\extension_host_manifest.json" /f

有趣的文档链接

Edge Extension Native Messaging

App to App communication 注意:这种方法似乎已经过时,因为 Edge 更改了其本机消息传递机制以匹配 Chrome 浏览器之一。至少,尽管我付出了很多努力,但我还是没能让它发挥作用。

我的问题

现在,我需要使用这个浏览器扩展助手来打包 UWP 应用程序。 我希望能够通过 Microsoft Store 和旁加载分发我的应用。

所以我正在尝试创建一个内置到 msixbundle 中的新打包程序项目,但我以前从未这样做过,我不知道应该如何做到这一点。

  • 具体来说,我如何让 msixbundle 在注册表中添加密钥(理想情况下是在安装时或在运行时)?
  • 如何确保 browserExtensionHelper.exe 能够读取 UWP 应用私有文件? (我在某处读到只有当 .exe 与它尝试读取的文件位于同一目录中时,这才有可能)

当然,如果您认为我做错了,请不要犹豫,提出一种新方法

非常感谢所有愿意看这个的人。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?