Créer un correctif Package Support Framework
S’il n’existe aucun correctif d’exécution pour votre problème, vous pouvez créer un correctif d’exécution en écrivant des fonctions de remplacement et en incluant toutes les données de configuration qui sont logiques. Examinons chaque partie.
Fonctions de remplacement
Tout d’abord, identifiez les appels de fonction qui échouent lorsque votre application s’exécute dans un conteneur MSIX. Ensuite, vous pouvez créer des fonctions de remplacement que vous souhaitez que le gestionnaire de runtime appellent à la place. Cela vous donne l’opportunité de remplacer l’implémentation d’une fonction par un comportement qui est conforme aux règles de l’environnement d’exécution moderne.
Déclarez la FIXUP_DEFINE_EXPORTS
macro, puis ajoutez une instruction include pour le fixup_framework.h
haut de chaque fichier . Fichier CPP dans lequel vous envisagez d’ajouter les fonctions de votre correctif d’exécution.
#define FIXUP_DEFINE_EXPORTS
#include <fixup_framework.h>
Important
Vérifiez que la FIXUP_DEFINE_EXPORTS
macro s’affiche avant l’instruction Include.
Créez une fonction qui a la même signature que celle du comportement de la fonction que vous souhaitez modifier. Voici un exemple de fonction qui remplace la MessageBoxW
fonction.
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);
L’appel pour DECLARE_FIXUP
mappe la MessageBoxW
fonction à votre nouvelle fonction de remplacement. Lorsque votre application tente d’appeler la MessageBoxW
fonction, elle appelle la fonction de remplacement à la place.
Protéger contre les appels récursifs aux fonctions dans les correctifs d’exécution
Le reentrancy_guard
type peut être ajouté à vos fonctions pour les protéger contre les appels de fonction récursifs.
Par exemple, vous pouvez produire une fonction de remplacement pour la CreateFile
fonction. Votre implémentation peut appeler la CopyFile
fonction, mais l’implémentation de la CopyFile
fonction peut appeler la CreateFile
fonction. Cela peut entraîner un cycle récursif infini d’appels à la CreateFile
fonction.
Pour plus d’informations sur authoring.md reentrancy_guard
Données de configuration
Si vous souhaitez ajouter des données de configuration à votre correctif d’exécution, envisagez de l’ajouter config.json
au fichier . De cette façon, vous pouvez utiliser la FixupQueryCurrentDllConfig
méthode pour analyser facilement ces données. Cet exemple analyse une valeur booléenne et de chaîne à partir de ce fichier de configuration.
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();
}
}
Métadonnées de correction
Chaque correctif et l’application Lanceur PSF ont un fichier de métadonnées XML qui contient les informations suivantes :
- Version : la version du PSF est en MAJOR. MINEUR. Format PATCH selon Sem Version 2.
- Plateforme Windows minimale : version minimale requise pour la correction ou le Lanceur PSF.
- Description : brève description du correctif.
- WhenToUse : Heuristics on when you should apply the fixup.
Pour obtenir un exemple, consultez le fichier de métadonnées FileRedirectionFixupMetadata.xml pour la correction de redirection. Le schéma de métadonnées est disponible ici.