Создание привязки для платформы поддержки пакетов
Если для проблемы нет исправления среды выполнения, можно создать новое исправление среды выполнения, написав функции замены и включив все данные конфигурации, которые имеют смысл. Рассмотрим каждую часть.
Функции замены
Сначала определите, какие вызовы функций завершаются сбоем при запуске приложения в контейнере MSIX. Затем вам нужно создать альтернативные функции, которые должен вызвать диспетчер среды выполнения. Это позволит вам заменить реализацию функции, чтобы ее поведение соответствовало правилам работы с современными средами выполнения.
Объявите FIXUP_DEFINE_EXPORTS
макрос, а затем добавьте инструкцию include для fixup_framework.h
каждой из них. 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);
Вызов 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 находится в MAJOR. НЕЗНАЧИТЕЛЬНЫЕ. Формат PATCH в соответствии с sem версии 2.
- Минимальная платформа Windows: минимальная версия windows, необходимая для исправления или средства запуска PSF.
- Описание: краткое описание исправления.
- WhenToUse: Эвристика, когда следует применить исправление.
Пример см. в файле метаданных FileRedirectionFixupMetadata.xml для исправления перенаправления. Схема метаданных доступна здесь.