Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Un proceso se empaqueta cuando tiene identidad de paquete. Un proceso está sin empaquetar cuando no tiene identidad de paquete. Esta distinción se aplica a los procesos en lugar de solo a las aplicaciones porque las tareas en segundo plano, los servidores fuera de proceso y otros procesos también pueden tener identidad de paquete.
La identidad del paquete puede provenir de un paquete que contiene los archivos de aplicación o de un paquete con ubicación externa. Por lo tanto, la detección de la identidad del paquete no indica dónde se almacenan los archivos de aplicación o qué modelo de empaquetado usa la aplicación.
Una aplicación puede comprobar su identidad en tiempo de ejecución antes de usar una característica que requiera la identidad del paquete, seleccionar un mecanismo de actualización o elegir una ubicación de almacenamiento.
Comprobar un proceso en el Administrador de tareas
Puede inspeccionar un proceso en ejecución sin cambiar la aplicación:
- Abra el Administrador de tareas y seleccione Detalles.
- Haga clic con el botón derecho en un encabezado de columna y seleccione Seleccionar columnas.
- Seleccione Nombre del paquete y, a continuación, seleccione Aceptar.
El campo Nombre del paquete está en blanco para un proceso sin empaquetar. Para un proceso empaquetado, normalmente contiene el nombre para mostrar localizado del paquete. No se garantiza que los nombres para mostrar sean únicos. Si el Administrador de tareas no puede resolver el recurso localizado, podría mostrar una ms-resource: referencia en su lugar.
Uso de GetCurrentPackageFullName en código nativo
Llame a GetCurrentPackageFullName sin un búfer:
-
ERROR_INSUFFICIENT_BUFFERsignifica que el proceso tiene la identidad del paquete. -
APPMODEL_ERROR_NO_PACKAGEsignifica que el proceso no tiene identidad de paquete. - Cualquier otro valor es un error que la aplicación debe controlar.
#include <Windows.h>
#include <appmodel.h>
LONG IsPackagedProcess(bool* isPackaged)
{
if (isPackaged == nullptr)
{
return ERROR_INVALID_PARAMETER;
}
*isPackaged = false;
UINT32 length = 0;
const LONG result = GetCurrentPackageFullName(&length, nullptr);
if (result == ERROR_INSUFFICIENT_BUFFER)
{
*isPackaged = true;
return ERROR_SUCCESS;
}
if (result == APPMODEL_ERROR_NO_PACKAGE)
{
return ERROR_SUCCESS;
}
return result;
}
Esta comprobación no necesita recuperar el nombre completo del paquete. Si también necesita el valor de identidad, asigne un búfer de la longitud devuelta y vuelva a llamar a GetCurrentPackageFullName .
Uso de la función GetCurrentPackageFullName en código administrado
Use la invocación de plataforma (P/Invoke) para llamar a GetCurrentPackageFullName desde .NET:
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
internal static class PackageIdentity
{
private const int ErrorInsufficientBuffer = 122;
private const int AppModelErrorNoPackage = 15700;
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
private static extern int GetCurrentPackageFullName(
ref int packageFullNameLength,
IntPtr packageFullName);
public static bool IsPackagedProcess()
{
var length = 0;
var result = GetCurrentPackageFullName(ref length, IntPtr.Zero);
return result switch
{
ErrorInsufficientBuffer => true,
AppModelErrorNoPackage => false,
_ => throw new Win32Exception(result),
};
}
}
No trate todos los valores devueltos distintos de cero como indicación de que el proceso está desempaquetado. Valores distintos de ERROR_INSUFFICIENT_BUFFER y APPMODEL_ERROR_NO_PACKAGE representan errores.