建立套件支援架構修復

如果您的問題沒有執行時間修正,您可以撰寫取代函式並包含任何有意義的設定數據,以建立新的運行時間修正。 讓我們看看每個部分。

取代函式

首先,識別應用程式在 MSIX 容器中執行時,哪些函式呼叫失敗。 然後,您可以建立替代函式,讓執行階段管理員改為呼叫該函式。 這可讓您以符合最新執行階段環境規則的行為,取代函式實作。

FIXUP_DEFINE_EXPORTS宣告宏,然後為每個 fixup_framework.h 頂端的 加入 include 語句。您想要在其中新增運行時間修正函式的 CPP 檔案。

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

將函MessageBoxW式對應至新取代函式的呼叫DECLARE_FIXUP。 當您的應用程式嘗試呼叫 MessageBoxW 函式時,它會改為呼叫 replacement 函式。

防止運行時間修正中的函式遞歸呼叫

類型 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 的版本在MAJOR中。小。根據 Sem 第 2 版的 PATCH 格式。
  • 最低 Windows 平臺:修正程式或 PSF 啟動器所需的最低 Windows 版本。
  • 描述:修正的簡短描述。
  • WhenToUse:您應該在何時套用修正程式時進行啟發學習法。

如需範例,請參閱重新導向修正的 FileRedirectionFixupMetadata.xml 元數據檔案。 您可以在這裡取得元數據架構。