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 pertinentes. 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
en haut de chaque . 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
Assurez-vous que la macro s’affiche FIXUP_DEFINE_EXPORTS
avant l’instruction include.
Créez une fonction qui a la même signature que celle 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 à 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.
Protection contre les appels récursifs aux fonctions dans les correctifs du runtime
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, reentrancy_guard
consultez authoring.md
Données de configuration
Si vous souhaitez ajouter des données de configuration à votre correctif runtime, envisagez de les ajouter à .config.json
De cette façon, vous pouvez utiliser pour FixupQueryCurrentDllConfig
analyser facilement ces données. Cet exemple analyse une valeur booléenne et une valeur 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();
}
}
Corriger les métadonnées
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 windows minimale requise pour le correctif ou le lanceur PSF.
- Description : brève description du correctif.
- WhenToUse : heuristique sur le moment où vous devez appliquer le correctif.
Pour obtenir un exemple, consultez le fichier de métadonnéesFileRedirectionFixupMetadata.xml pour la correction de redirection. Le schéma de métadonnées est disponible ici.