Creare una correzione del Package Support Framework

Se non esiste alcuna correzione di runtime per il problema, è possibile creare una nuova correzione di runtime scrivendo funzioni sostitutive e includendo tutti i dati di configurazione che hanno senso. Esaminiamo ogni parte.

Funzioni di sostituzione

Prima di tutto, identificare quali chiamate di funzione hanno esito negativo quando l'applicazione viene eseguita in un contenitore MSIX. Quindi, devi creare funzioni sostitutive da far chiamare dal gestore runtime. Questo offre la possibilità di sostituire l'implementazione di una funzione con un comportamento conforme alle regole dell'ambiente di runtime moderno.

Dichiarare la macro e quindi aggiungere un'istruzione FIXUP_DEFINE_EXPORTS di inclusione per l'oggetto fixup_framework.h nella parte superiore di ogni oggetto . File CPP in cui si intende aggiungere le funzioni della correzione del runtime.

#define FIXUP_DEFINE_EXPORTS
#include <fixup_framework.h>

Importante

Assicurarsi che la FIXUP_DEFINE_EXPORTS macro venga visualizzata prima dell'istruzione di inclusione.

Creare una funzione con la stessa firma della funzione che si vuole modificare. Ecco una funzione di esempio che sostituisce la MessageBoxW funzione.

auto MessageBoxWImpl = &::MessageBoxW;
int WINAPI MessageBoxWFixup(
    _In_opt_ HWND hwnd,
    _In_opt_ LPCWSTR,
    _In_opt_ LPCWSTR caption,
    _In_ UINT type)
{
    return MessageBoxWImpl(hwnd, L"SUCCESS: This worked", caption, type);
}

DECLARE_FIXUP(MessageBoxWImpl, MessageBoxWFixup);

La chiamata a DECLARE_FIXUP esegue il mapping della MessageBoxW funzione alla nuova funzione di sostituzione. Quando l'applicazione tenta di chiamare la MessageBoxW funzione, chiamerà invece la funzione sostitutiva.

Proteggere da chiamate ricorsive alle funzioni nelle correzioni di runtime

Il reentrancy_guard tipo può essere aggiunto alle funzioni per proteggerle dalle chiamate di funzione ricorsive.

Ad esempio, è possibile produrre una funzione sostitutiva per la CreateFile funzione. L'implementazione potrebbe chiamare la CopyFile funzione, ma l'implementazione della CopyFile funzione potrebbe chiamare la CreateFile funzione. Ciò può causare un ciclo ricorsivo infinito di chiamate alla CreateFile funzione.

Per altre informazioni su reentrancy_guard vedere authoring.md

Dati di configurazione

Se si vogliono aggiungere dati di configurazione alla correzione del runtime, è consigliabile aggiungerli all'oggetto config.json. In questo modo, è possibile usare l'oggetto FixupQueryCurrentDllConfig per analizzare facilmente i dati. In questo esempio viene analizzato un valore booleano e stringa da tale file di configurazione.

if (auto configRoot = ::FixupQueryCurrentDllConfig())
{
    auto& config = configRoot->as_object();

    if (auto enabledValue = config.try_get("enabled"))
    {
        g_enabled = enabledValue->as_boolean().get();
    }

    if (auto logPathValue = config.try_get("logPath"))
    {
        g_logPath = logPathValue->as_string().wstring();
    }
}

Correzione dei metadati

Ogni correzione e l'applicazione PSF Launcher ha un file di metadati XML che contiene le informazioni seguenti:

  • Versione: la versione del PSF è in MAJOR. MINORE. Formato PATCH in base alla versione 2 di Sem.
  • Piattaforma Windows minima: versione minima di Windows necessaria per il programma di correzione o psF Launcher.
  • Descrizione: breve descrizione della correzione.
  • WhenToUse: Heuristics on quando è necessario applicare la correzione.

Per un esempio, vedere il file di metadati FileRedirectionFixupMetadata.xml per la correzione del reindirizzamento. Lo schema dei metadati è disponibile qui.