建立套件支援架構修復
如果您的問題沒有執行時間修正,您可以撰寫取代函式並包含任何有意義的設定數據,以建立新的運行時間修正。 讓我們看看每個部分。
取代函式
首先,識別應用程式在 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 元數據檔案。 您可以在這裡取得元數據架構。