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

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

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

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