次の方法で共有


パッケージ サポート フレームワークの修正プログラムを作成する

問題のランタイム修正がない場合は、置換関数を記述し、意味のある構成データを含めることで、新しいランタイム修正プログラムを作成できます。 各部分を見てみましょう。

置換関数

まず、アプリケーションが MSIX コンテナーで実行されたときに失敗する関数呼び出しを特定します。 次に、ランタイム マネージャーで代わりに呼び出す差し替え用の関数を作成できます。 これにより、関数の実装を最新のランタイム環境の規則に準拠した動作に置き換えることができます。

FIXUP_DEFINE_EXPORTS マクロを宣言してから、ランタイム修正の関数を追加したい各 .CPP ファイルの先頭に、fixup_framework.h の include ステートメントを追加します。

#define FIXUP_DEFINE_EXPORTS
#include <fixup_framework.h>

重要

FIXUP_DEFINE_EXPORTS マクロが include ステートメントの前に表示されていることを確認します。

変更する動作の関数と同じシグネチャを持つ関数を作成します。 MessageBoxW関数を置き換える関数の例を次に示します。

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);

DECLARE_FIXUPを呼び出すと、MessageBoxW関数が新しい置換関数にマップされます。 アプリケーションが MessageBoxW 関数を呼び出そうとすると、代わりに置換関数が呼び出されます。

ランタイム修正での関数の再帰呼び出しから保護する

reentrancy_guard型を関数に追加して、再帰関数呼び出しから保護できます。

たとえば、 CreateFile 関数の置換関数を生成できます。 実装では CopyFile 関数を呼び出す可能性がありますが、 CopyFile 関数の実装では CreateFile 関数が呼び出される可能性があります。 これにより、 CreateFile 関数の呼び出しが無限の再帰サイクルにつながる可能性があります。

reentrancy_guardの詳細については、authoring.md を参照してください。

構成データ

ランタイム修正プログラムに構成データを追加する場合は、 config.jsonに追加することを検討してください。 そうすることで、 FixupQueryCurrentDllConfig を使用してそのデータを簡単に解析できます。 この例では、その構成ファイルのブール値と文字列値を解析します。

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();
    }
}

メタデータを修正

各修正プログラムと PSF ランチャー アプリケーションには、次の情報を含む XML メタデータ ファイルがあります。

  • バージョン: PSF のバージョンは SemVer 2.0 に従った MAJOR.MINOR.PATCH 形式になっています。
  • 最小 Windows プラットフォーム: 修正プログラムまたは PSF ランチャーに必要な最小 Windows バージョン。
  • 説明: 修正の簡単な説明。
  • WhenToUse: 修正プログラムを適用する必要がある場合のヒューリスティック。

例については、リダイレクトの修正に関する FileRedirectionFixupMetadata.xml メタデータ ファイルを参照してください。 メタデータ スキーマは 、ここで入手できます。