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 che hanno senso. Esaminiamo 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 l'oggetto fixup_framework.h
nella parte superiore di ogni . 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 FIXUP_DEFINE_EXPORTS
macro venga 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 MessageBoxW
funzione alla nuova funzione di sostituzione. Quando l'applicazione tenta di chiamare la MessageBoxW
funzione, chiamerà invece la funzione di sostituzione.
Protezione dalle chiamate ricorsive alle funzioni nelle correzioni di runtime
Il reentrancy_guard
tipo può essere aggiunto alle funzioni per proteggerli 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ò portare a un ciclo ricorsivo infinito di chiamate alla CreateFile
funzione.
Per altre informazioni su reentrancy_guard
authoring.md
Dati di configurazione
Se si vogliono aggiungere dati di configurazione alla correzione di runtime, è consigliabile aggiungerli a config.json
. In questo modo, è possibile usare per FixupQueryCurrentDllConfig
analizzare facilmente i dati. Questo esempio analizza 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 Launcher PSF hanno un file di metadati XML che contiene le informazioni seguenti:
- Versione: la versione di PSF è in MAJOR. MINORE. Formato PATCH in base alla sem versione 2.
- Piattaforma Windows minima: versione minima di Windows necessaria per la correzione o l'utilità di avvio PSF.
- Descrizione: breve descrizione della correzione.
- WhenToUse: euristica su 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.