Creare una correzione del Package Support Framework

Se non è disponibile alcuna correzione di runtime per il problema, è possibile creare una nuova correzione di runtime scrivendo funzioni di sostituzione e includendo tutti i dati di configurazione più sensato. Diamo un'occhiata a ogni parte.

Funzioni di sostituzione

Identificare prima di tutto 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 FIXUP_DEFINE_EXPORTS macro e quindi aggiungere un'istruzione include per nella parte superiore di ogni fixup_framework.h . File CPP in cui si intende aggiungere le funzioni della correzione di runtime.

#define FIXUP_DEFINE_EXPORTS
#include <fixup_framework.h>

Importante

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

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 funzione alla nuova funzione di MessageBoxW sostituzione. Quando l'applicazione tenta di chiamare MessageBoxW la funzione , chiamerà invece la funzione di sostituzione.

Proteggere dalle 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 di sostituzione per la CreateFile funzione. L'implementazione potrebbe CopyFile chiamare la funzione , ma l'implementazione della funzione potrebbe chiamare la funzione CopyFile CreateFile . Ciò può causare un ciclo ricorsivo infinito di chiamate alla CreateFile funzione.

Per altre informazioni, reentrancy_guard vedere authoring.md

Dati di configurazione

Se si desidera aggiungere dati di configurazione alla correzione di runtime, è consigliabile aggiungerli a config.json . In questo modo, è possibile usare FixupQueryCurrentDllConfig per analizzare facilmente i dati. Questo esempio analizza un valore booleano e un valore 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 hanno un file di metadati XML che contiene le informazioni seguenti:

  • Versione: la versione di PSF è in MAJOR. MINORE. Formato PATCH in base a Sem versione 2.
  • Piattaforma Windows minima: la versione minima di Windows necessaria per la correzione o l'utilità di avvio di PSF.
  • Descrizione: breve descrizione della correzione.
  • WhenToUse: euristica su quando applicare la correzione.

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