【问题标题】:Is Memory-mapped-files as ipc between uwp app and win32 process supported内存映射文件是否支持 uwp 应用程序和 win32 进程之间的 ipc
【发布时间】:2020-11-24 14:01:40
【问题描述】:

官方文档没有正确说明 ipc via memory-mapped-files 是否在 uwp 中受支持。我正在研究 uwp 应用程序与其桌面扩展之间的 ipc 方案。虽然我可以使用具有codeGeneration 功能的uwp 应用程序中的System.IO.MemoryMappedFiles 创建内存映射文件,但从win32 进程打开失败并显示消息Unable to find the specified file.。 uwp是否支持通过内存映射文件进行ipc,如果支持,正确的方法是什么??

Minimal reproduceable sample.

更新 1

Updated sample implementing answer from @Peter Torr - MSFT.

更新 2

Working sample in which memory-mapped-file created from uwp app can be read by win32 process.在由win32进程创建的uwp应用程序中读取内存映射文件仍然无法正常工作。

【问题讨论】:

  • 您好,根据this document中的信息,共享内存有一些限制。默认情况下,只允许同一包中的进程访问。如果您满足这些限制条件,您能否提供一个最低限度的可运行演示,以便我们分析您的问题?
  • @RichardZhang-MSFT 添加了演示项目。随意测试它。

标签: c# windows uwp ipc memory-mapped-files


【解决方案1】:

是的,它受支持,但如果您在 UWP 上下文中创建对象并从桌面上下文中打开它,则桌面进程需要显式使用命名对象的命名空间。

在您的 UWP 进程中,调用 GetAppContainerNamedObjectPath(nullptr, nullptr, ...) 以确定该命名空间是什么,然后在末尾添加一个反斜杠和您的映射文件名。类似于AppContainerNamedObjects\S-1-15-2-xxxxxxx\YourMappedName

您应该只需要这样做一次,除非您更改您的包名称(包括发布者哈希)。因此,一旦您生成了它,您就可以将值硬编码到您的桌面应用程序中,然后忘记它。

请注意,如果您以相反的方式执行此操作 - 桌面创建对象,然后 UWP 打开它 - 那么您无需担心命名空间,但您必须修改访问控制,这比较棘手。

【讨论】:

  • 如果您需要在字符串文字中使用双反斜杠,请记住使用。 xxxxxx 位特定于您的应用程序。
  • WebAuthenticationBroker.GetCurrentApplicationCallbackUri().Host 的 sid 字符串是小写转换为大写使其工作。另外,你能建议如何做相反的事情吗?从 uwp 应用程序读取由桌面扩展创建的内存映射??
  • 反向操作有点复杂,除非你真的需要,否则我不会推荐它。如果你弄乱了代码,你最终可能会让错误的应用程序访问内存。
  • 嗨@PeterTorr-MSFT -- 我正在尝试在 UWP 应用程序中使用 CreateEventA 创建一个事件,以便与 Win32 应用程序通信并获取错误代码 3(找不到文件): CreateEventA (NULL, false, false, k_writerEventName) 其中:k_writerEventName = "AppContainerNamedObjects\\S-1-15-2-3950821806-2383410207-2205885981-1193157422-352231163-3160459235-648191853\\WriterEvent";知道为什么这可能无法创建事件吗?
  • 你的字符串使用双反斜杠吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 2016-03-22
相关资源
最近更新 更多