パッケージ サポート フレームワークの修正を作成するCreate a Package Support Framework fixup

問題のランタイム修正プログラムがない場合は、置換関数を記述し、意味のある構成データを含めることで、新しいランタイム修正プログラムを作成できます。If there is no runtime fix for your issue, you can create a new runtime fix by writing replacement functions and including any configuration data that makes sense. では、各部分を見てみましょう。Let's look at each part.

置換関数Replacement functions

まず、アプリケーションが MSIX コンテナーで実行されている場合に失敗する関数呼び出しを特定します。First, identify which function calls fail when your application runs in an MSIX container. 次に、ランタイム マネージャーで代わりに呼び出す差し替え用の関数を作成できます。Then, you can create replacement functions that you'd like the runtime manager to call instead. これにより、関数の実装を最新のランタイム環境の規則に準拠した動作に置き換えることができます。This gives you an opportunity to replace the implementation of a function with behavior that conforms to the rules of the modern runtime environment.

マクロを宣言 FIXUP_DEFINE_EXPORTS し、 fixup_framework.h それぞれの先頭にの include ステートメントを追加します。ランタイム修正プログラムの関数を追加する CPP ファイル。Declare the FIXUP_DEFINE_EXPORTS macro and then add a include statement for the fixup_framework.h at the top of each .CPP file where you intend to add the functions of your runtime fix.

#define FIXUP_DEFINE_EXPORTS
#include <fixup_framework.h>

重要

FIXUP_DEFINE_EXPORTSマクロが include ステートメントの前に表示されていることを確認します。Make sure that the FIXUP_DEFINE_EXPORTS macro appears before the include statement.

変更する動作の関数と同じシグネチャを持つ関数を作成します。Create a function that has the same signature of the function who's behavior you want to modify. 関数を置き換える関数の例を次に示し MessageBoxW ます。Here's an example function that replaces the MessageBoxW function.

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 関数が新しい置換関数にマップされます。The call to DECLARE_FIXUP maps the MessageBoxW function to your new replacement function. アプリケーションで関数を呼び出そうとすると、 MessageBoxW 代わりに置換関数が呼び出されます。When your application attempts to call the MessageBoxW function, it will call the replacement function instead.

ランタイム修正プログラムにおける関数の再帰呼び出しからの保護Protect against recursive calls to functions in runtime fixes

reentrancy_guard関数に型を追加して、再帰的な関数呼び出しから保護することができます。The reentrancy_guard type can be added to your functions to protect them against recursive function calls.

たとえば、関数の置換関数を生成する場合があり CreateFile ます。For example, you might produce a replacement function for the CreateFile function. 実装によって関数が呼び出される場合もあり CopyFile ますが、関数の実装は関数を CopyFile 呼び出す可能性があり CreateFile ます。Your implementation might call the CopyFile function, but the implementation of the CopyFile function might call the CreateFile function. これにより、関数の呼び出しが無限に再帰的に発生する可能性があり CreateFile ます。This may lead to an infinite recursive cycle of calls to the CreateFile function.

詳細については、 reentrancy_guardauthoring.md 」を参照してください。For more information on reentrancy_guard see authoring.md

構成データConfiguration data

ランタイム修正プログラムに構成データを追加する場合は、に追加することを検討してください config.jsonIf you want to add configuration data to your runtime fix, consider adding it to the config.json. こうすることで、を使用し FixupQueryCurrentDllConfig てそのデータを簡単に解析できます。That way, you can use the FixupQueryCurrentDllConfig to easily parse that data. この例では、その構成ファイルからブール値と文字列値を解析します。This example parses a boolean and string value from that configuration file.

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

メタデータの修正Fixup metadata

各フィックスアップと PSF ランチャーアプリケーションには、次の情報を含む XML メタデータファイルがあります。Each fixup and the PSF Launcher application has an XML metadata file that contains the following information:

  • バージョン: PSF のバージョンはメジャーです。マイナー.Sem バージョン 2によるパッチ形式。Version: The version of the PSF is in MAJOR.MINOR.PATCH format according to Sem Version 2.
  • 最小 Windows プラットフォーム: fixup または PSF ランチャーに必要な windows の最小バージョン。Minimum Windows Platform: The minimum windows version required for the fixup or PSF Launcher.
  • 説明: フィックスアップの簡単な説明。Description: A short description of the fixup.
  • WhenToUse: fixup を適用する必要がある場合のヒューリスティック。WhenToUse: Heuristics on when you should apply the fixup.

例については、リダイレクトの修正のためのFileRedirectionFixupMetadataメタデータファイルを参照してください。For an example, see the FileRedirectionFixupMetadata.xml metadata file for the redirection fixup. メタデータスキーマについては、こちらを参照してください。The metadata schema is available here.