パッケージ サポート フレームワークの修正を作成する
問題に対するランタイム修正がない場合は、差し替え用の関数を記述し、意味のある構成データを含めて、新しいランタイム修正を作成できます。 各部分を見てみましょう。
差し替え用の関数
まず、MSIX コンテナー内でアプリケーションを実行したときにどの関数呼び出しが失敗するかを特定します。 次に、ランタイム マネージャーで代わりに呼び出す差し替え用の関数を作成できます。 これにより、関数の実装を最新のランタイム環境の規則に準拠した動作に置き換えることができます。
FIXUP_DEFINE_EXPORTS
マクロを宣言し、ランタイム修正の関数を追加する各 .CPP ファイルの先頭に、fixup_framework.h
の include ステートメントを追加します。
#define FIXUP_DEFINE_EXPORTS
#include <fixup_framework.h>
重要
include ステートメントより前に FIXUP_DEFINE_EXPORTS
マクロがあることを確認します。
変更対象の動作を行う関数と同じシグネチャを持つ関数を作成します。 以下に、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 メタデータ ファイルがあります。
- Version: PSF のバージョンは、Sem Version 2 に従って、MAJOR.MINOR.PATCH 形式です。
- Minimum Windows Platform: 修正または PSF 起動ツールに必要な最小 Windows バージョン。
- Description: 修正の短い説明。
- WhenToUse: 修正を適用する必要がある場合についてのヒューリスティック。
例については、リダイレクトの修正に対する FileRedirectionFixupMetadata.xml メタデータ ファイルを参照してください。 メタデータ スキーマは、こちらから使用できます。