共享命名对象

本主题说明如何在通用 Windows 平台 (UWP) 应用程序和 Win32 应用程序之间共享命名对象。

打包应用程序中的命名对象

命名对象为进程提供了一种简单的方法来共享对象句柄。 在进程创建命名对象后,其他进程可以使用该名称来调用相应的函数以打开该对象的句柄。 命名对象通常用于线程同步进程间通信

默认情况下,打包应用程序只能访问其已创建的命名对象。 为了与打包应用程序共享命名对象,必须在创建对象时设置权限,并且必须在打开对象时限定名称。

创建命名对象

使用相应的 Create API 创建命名对象:

所有这些 API 共享一个 LPSECURITY_ATTRIBUTES 参数,调用方可以使用该参数指定访问控制列表 (ACL),以控制哪些进程可以访问对象。 若要与打包应用程序共享命名对象,必须在创建命名对象时在 ACL 中授予权限。

安全标识符 (SID) 表示 ACL 中的标识。 每个打包应用程序都有自己的基于包系列名称的 SID。 可以通过将包系列名称传递到 DeriveAppContainerSidFromAppContainerName 来生成打包应用程序的 SID。

注意

可以通过 Visual Studio 中的包清单编辑器(在开发时)、通过合作伙伴中心(适用于通过 Microsoft Store 发布的应用程序)或通过 Get-AppxPackage PowerShell 命令(适用于已安装的应用程序),找到包系列名称。

此示例演示了对命名对象执行 ACL 操作所需的基本模式。 若要与打包应用程序共享命名对象,请为每个应用程序生成一个 EXPLICIT_ACCESS 结构:

通过在 Create 调用中使用打包应用程序的 EXPLICIT_ACCESS 规则来填充 LPSECURITY_ATTRIBUTES 参数,可以授予对这些应用程序的访问权限,以打开命名对象。

注意

Win32 应用程序可以访问由打包应用程序创建的所有命名对象,前提是在打开对象名称时对这些名称进行限定。 不需要为其授予访问权限。

打开命名对象

通过将名称传递给相应的 Open API 来打开命名对象:

打包应用程序创建的命名对象是在应用程序的命名空间(也称为命名对象路径)中创建的。 打开打包应用程序创建的命名对象时,对象名称必须以创建应用程序的命名对象路径为前缀。

GetAppContainerNamedObjectPath 将根据其 SID 返回打包应用程序的命名对象路径。 可以通过将包系列名称传递到 DeriveAppContainerSidFromAppContainerName 来生成打包应用程序的 SID。

注意

可以通过 Visual Studio 中的包清单编辑器(在开发时)、通过合作伙伴中心(适用于通过 Microsoft Store 发布的应用程序)或通过 Get-AppxPackage PowerShell 命令(适用于已安装的应用程序),找到包系列名称。

打开打包应用程序创建的命名对象时,请使用 <PATH>\<NAME> 格式:

  • <PATH> 替换为创建应用程序的命名对象路径。
  • <NAME> 替换为对象名称。

注意

只有在打包应用程序创建了对象时,才需要为对象名称添加前缀 <PATH>。 不需要对 Win32 应用程序创建的命名对象进行限定,虽然在创建这些对象时仍需授予访问权限。

注解

默认情况下,将隔离打包应用程序中的命名对象,以维护安全性并确保对应用程序生命周期事件(如挂起和终止)的支持。 跨应用程序共享命名对象会引入严格的绑定和版本控制约束,并要求每个应用程序都可以适应其他应用程序的生命周期。 由于这些原因,建议仅在来自同一发布者的应用程序之间共享命名对象。