Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Un processo è pacchettizzato quando ha l'identità del pacchetto. Un processo viene non pacchettizzato quando non ha un'identità del pacchetto. Questa distinzione si applica ai processi anziché solo alle applicazioni perché le attività in background, i server out-of-process e altri processi possono avere anche l'identità del pacchetto.
L'identità del pacchetto può provenire da un pacchetto che contiene i file dell'applicazione o da un pacchetto con percorso esterno. Di conseguenza, il rilevamento dell'identità del pacchetto non indica dove vengono archiviati i file dell'applicazione o quale modello di creazione di pacchetti usa l'app.
Un'app potrebbe controllare la propria identità di runtime prima di usare una funzionalità che richiede l'identità del pacchetto, selezionare un meccanismo di aggiornamento o scegliere un percorso di archiviazione.
Controllare un processo in Gestione attività
È possibile esaminare un processo in esecuzione senza modificare l'app:
- Aprire Gestione attività e selezionare Dettagli.
- Fare clic con il pulsante destro del mouse su un'intestazione di colonna e quindi selezionare Seleziona colonne.
- Selezionare Nome pacchetto e quindi ok.
Il campo Nome pacchetto è vuoto per un processo non in pacchetto. Per un processo in pacchetto, in genere contiene il nome visualizzato localizzato del pacchetto. I nomi visualizzati non sono necessariamente univoci. Se Gestione attività non riesce a risolvere la risorsa localizzata, potrebbe invece visualizzare un ms-resource: riferimento.
Usare GetCurrentPackageFullName nel codice nativo
Chiamare GetCurrentPackageFullName senza buffer:
-
ERROR_INSUFFICIENT_BUFFERindica che il processo ha un'identità del pacchetto. -
APPMODEL_ERROR_NO_PACKAGEsignifica che il processo non ha un'identità del pacchetto. - Qualsiasi altro valore è un errore che l'app deve gestire.
#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;
}
Questo controllo non deve recuperare il nome completo del pacchetto. Se è necessario anche il valore Identity, allocare un buffer della lunghezza restituita e chiamare GetCurrentPackageFullName di nuovo.
Usare la funzione GetCurrentPackageFullName nel codice gestito
Usare Platform Invocation per chiamare GetCurrentPackageFullName da .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),
};
}
}
Non considerare ogni valore restituito diverso da zero come indicazione che il processo non è incluso in pacchetto. Valori diversi da ERROR_INSUFFICIENT_BUFFER e APPMODEL_ERROR_NO_PACKAGE rappresentano errori.