Поделиться через


Создание привязки для платформы поддержки пакетов

Если для проблемы нет исправления среды выполнения, можно создать новое исправление среды выполнения, написав функции замены и включив все данные конфигурации, которые имеют смысл. Рассмотрим каждую часть.

Функции замены

Сначала определите, какие вызовы функций завершаются сбоем при запуске приложения в контейнере 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 для исправления перенаправления. Схема метаданных доступна здесь.