Compartición de objetos con nombreSharing named objects

En este tema se explica cómo compartir objetos con nombre entre aplicaciones de Plataforma universal de Windows (UWP) y aplicaciones Win32.This topic explains how to share named objects between Universal Windows Platform (UWP) applications and Win32 applications.

Objetos con nombre en aplicaciones empaquetadasNamed objects in packaged applications

Los objetos con nombre proporcionan una manera sencilla de que los procesos compartan los identificadores de objetos.Named objects provide an easy way for processes to share object handles. Después de que un proceso haya creado un objeto con nombre, otros procesos pueden usar el nombre para llamar a la función adecuada para abrir un identificador del objeto.After a process has created a named object, other processes can use the name to call the appropriate function to open a handle to the object. Los objetos con nombre se utilizan normalmente para la sincronización de subprocesos y la comunicación entre procesos.Named objects are commonly used for thread synchronization and interprocess communication.

De forma predeterminada, las aplicaciones empaquetadas solo pueden tener acceso a los objetos con nombre que han creado.By default, packaged applications can only access named objects they've created. Para compartir objetos con nombre con aplicaciones empaquetadas, se deben establecer permisos al crear objetos y los nombres se deben calificar cuando se abren objetos.In order to share named objects with packaged applications, permissions must be set when objects are created, and names must be qualified when objects are opened.

Crear objetos con nombreCreating named objects

Los objetos con nombre se crean con una Create API correspondiente:Named objects are created with a corresponding Create API:

Todas estas API comparten un LPSECURITY_ATTRIBUTES parámetro que permite al llamador especificar listas de control de acceso (ACL) para controlar qué procesos pueden tener acceso al objeto.All of these APIs share an LPSECURITY_ATTRIBUTES parameter which enables the caller to specify access control lists (ACLs) to control what processes can access the object. Para compartir objetos con nombre con aplicaciones empaquetadas, se debe conceder el permiso dentro de las ACL cuando se creen los objetos con nombre.In order to share named objects with packaged applications, permission must be granted within the ACLs when the named objects are created.

Los identificadores de seguridad (SID) representan identidades dentro de las ACL.Security identifiers (SIDs) represent identities within ACLs. Cada aplicación empaquetada tiene su propio SID basado en el nombre de familia del paquete.Every packaged application has its own SID based on its package family name. Puede generar el SID para una aplicación empaquetada pasando su nombre de familia de paquete a DeriveAppContainerSidFromAppContainerName.You can generate the SID for a packaged application by passing its package family name to DeriveAppContainerSidFromAppContainerName.

Nota

El nombre de familia de paquete puede encontrarse en el editor de manifiestos de paquete de Visual Studio durante el tiempo de desarrollo, a través del centro de Partners para las aplicaciones publicadas a través del Microsoft Store o mediante el comando de PowerShell Get-AppxPackage para las aplicaciones que ya están instaladas.The package family name can be found via the package manifest editor in Visual Studio during development time, via Partner Center for applications published through the Microsoft Store, or via the Get-AppxPackage PowerShell command for applications that are already installed.

Este ejemplo muestra el patrón básico necesario para la ACL de un objeto con nombre.This sample demonstrates the basic pattern needed to ACL a named object. Para compartir objetos con nombre con aplicaciones empaquetadas, cree una estructura de EXPLICIT_ACCESS para cada aplicación:To share named objects with packaged applications, build an EXPLICIT_ACCESS structure for each application:

Al rellenar el LPSECURITY_ATTRIBUTES parámetro en Create llamadas con EXPLICIT_ACCESS reglas para aplicaciones empaquetadas, puede conceder acceso a esas aplicaciones para abrir el objeto con nombre.By populating the LPSECURITY_ATTRIBUTES parameter in Create calls with EXPLICIT_ACCESS rules for packaged applications, you can grant access to those applications to open the named object.

Nota

Las aplicaciones Win32 pueden tener acceso a todos los objetos con nombre creados por aplicaciones empaquetadas siempre que califiquen los nombres de objeto al abrirlos.Win32 applications can access all named objects created by packaged applications as long as they qualify the object names when opening them. No es necesario que se les conceda acceso.They do not need to be granted access.

Abrir objetos con nombreOpening named objects

Los objetos con nombre se abren pasando un nombre a una Open API correspondiente:Named objects are opened by passing a name to a corresponding Open API:

Los objetos con nombre creados por una aplicación empaquetada se crean en el espacio de nombres de la aplicación, también conocido como la ruta de acceso del objeto con nombre.Named objects created by a packaged application are created within the namespace of the application, otherwise known as the named object path. Al abrir los objetos con nombre creados por una aplicación empaquetada, los nombres de objeto deben ir precedidos de la ruta de acceso del objeto con nombre de la aplicación que se crea.When opening named objects created by a packaged application, the object names must be prefixed with the creating application's named object path.

GetAppContainerNamedObjectPath devolverá la ruta de acceso del objeto con nombre para una aplicación empaquetada en función de su SID.GetAppContainerNamedObjectPath will return the named object path for a packaged application based on its SID. Puede generar el SID para una aplicación empaquetada pasando su nombre de familia de paquete a DeriveAppContainerSidFromAppContainerName.You can generate the SID for a packaged application by passing its package family name to DeriveAppContainerSidFromAppContainerName.

Nota

El nombre de familia de paquete puede encontrarse en el editor de manifiestos de paquete de Visual Studio durante el tiempo de desarrollo, a través del centro de Partners para las aplicaciones publicadas a través del Microsoft Store o mediante el comando de PowerShell Get-AppxPackage para las aplicaciones que ya están instaladas.The package family name can be found via the package manifest editor in Visual Studio during development time, via Partner Center for applications published through the Microsoft Store, or via the Get-AppxPackage PowerShell command for applications that are already installed.

Al abrir los objetos con nombre creados por una aplicación empaquetada, use el formato <PATH>\<NAME> :When opening named objects created by a packaged application, use the format <PATH>\<NAME>:

  • Reemplazar <PATH> por la ruta de acceso del objeto con nombre de la aplicación de creación.Replace <PATH> with the creating application's named object path.
  • Reemplazar <NAME> por el nombre del objeto.Replace <NAME> with the object name.

Nota

El prefijo de los nombres de objeto con <PATH> solo es necesario si una aplicación empaquetada creó el objeto.Prefixing object names with <PATH> is only required if a packaged application created the object. No es necesario calificar los objetos con nombre creados por las aplicaciones Win32, aunque se debe conceder acceso al crearlos objetos.Named objects created by Win32 applications do not need to be qualified, though access must still be granted when the objects are created.

ObservacionesRemarks

Los objetos con nombre en aplicaciones empaquetadas están aislados de forma predeterminada para preservar la seguridad y garantizar la compatibilidad con eventos de ciclo de vida de la aplicación, como la suspensión y la terminación.Named objects in packaged applications are isolated by default to preserve security and ensure support for application lifecycle events like suspension and termination. El uso compartido de objetos con nombre entre aplicaciones presenta restricciones estrictas de enlace y control de versiones, y requiere que cada aplicación sea resistente al ciclo de vida de los demás.Sharing named objects across applications introduces tight binding and versioning constraints and requires each application to be resilient to the lifecycle of others. Por estos motivos, se recomienda compartir solo los objetos con nombre entre las aplicaciones del mismo publicador.For these reasons, it is recommended to only share named objects between applications from the same publisher.