Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 d'exécution appelle à 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 macro FIXUP_DEFINE_EXPORTS, puis ajoutez une instruction include pour le fixup_framework.h en haut de chaque fichier .CPP où vous prévoyez d'ajouter les fonctions de votre correction 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 à DECLARE_FIXUP associe la fonction MessageBoxW à 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 reentrancy_guard voir authoring.md
données de configuration ;
Si vous souhaitez ajouter des données de configuration à votre correctif d’exécution, envisagez de l'ajouter au fichier config.json. 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();
}
}
Ajustement des métadonnées
Chaque correctif et l’application psF Launcher possèdent un fichier de métadonnées XML qui contient les informations suivantes :
- Version : la version du PSF est en format MAJEUR.MINEUR.PATCH selon Sem Version 2.
- Plateforme Windows minimale : version minimale requise pour le correctif ou le lanceur PSF.
- Description : brève description du correctif.
- WhenToUse: Heuristiques sur le moment où vous devriez appliquer la correction.
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.