Создание привязки для платформы поддержки пакетовCreate a Package Support Framework fixup

Если для проблемы не существует исправления среды выполнения, можно создать новое исправление среды выполнения, записав функции замены и включив все данные конфигурации, имеющие смысл.If there is no runtime fix for your issue, you can create a new runtime fix by writing replacement functions and including any configuration data that makes sense. Рассмотрим каждую часть.Let's look at each part.

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

Сначала выясните, какие вызовы функций завершаются ошибкой при выполнении приложения в контейнере MSIX.First, identify which function calls fail when your application runs in an MSIX container. Затем вам нужно создать альтернативные функции, которые должен вызвать диспетчер среды выполнения.Then, you can create replacement functions that you'd like the runtime manager to call instead. Это позволит вам заменить реализацию функции, чтобы ее поведение соответствовало правилам работы с современными средами выполнения.This gives you an opportunity to replace the implementation of a function with behavior that conforms to the rules of the modern runtime environment.

Объявите FIXUP_DEFINE_EXPORTS макрос, а затем добавьте оператор include для элемента в fixup_framework.h верхней части каждого из них. CPP файл, в который вы собираетесь добавить функции исправления среды выполнения.Declare the FIXUP_DEFINE_EXPORTS macro and then add a include statement for the fixup_framework.h at the top of each .CPP file where you intend to add the functions of your runtime fix.

#define FIXUP_DEFINE_EXPORTS
#include <fixup_framework.h>

Важно!

Убедитесь, что FIXUP_DEFINE_EXPORTS макрос появился перед оператором include.Make sure that the FIXUP_DEFINE_EXPORTS macro appears before the include statement.

Создайте функцию, которая имеет ту же сигнатуру функции, что и поведение, которую необходимо изменить.Create a function that has the same signature of the function who's behavior you want to modify. Ниже приведен пример функции, которая заменяет MessageBoxW функцию.Here's an example function that replaces the MessageBoxW function.

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 функцию с новой замещающей функцией.The call to DECLARE_FIXUP maps the MessageBoxW function to your new replacement function. Когда приложение пытается вызвать MessageBoxW функцию, вместо этого будет вызываться функция замены.When your application attempts to call the MessageBoxW function, it will call the replacement function instead.

Защита от рекурсивных вызовов функций в исправлениях среды выполненияProtect against recursive calls to functions in runtime fixes

reentrancy_guardТип можно добавить в функции, чтобы защитить их от рекурсивных вызовов функций.The reentrancy_guard type can be added to your functions to protect them against recursive function calls.

Например, вы можете создать функцию замены для CreateFile функции.For example, you might produce a replacement function for the CreateFile function. Ваша реализация может вызвать CopyFile функцию, но реализация CopyFile функции может вызвать CreateFile функцию.Your implementation might call the CopyFile function, but the implementation of the CopyFile function might call the CreateFile function. Это может привести к бесконечному рекурсивному циклу вызовов CreateFile функции.This may lead to an infinite recursive cycle of calls to the CreateFile function.

Дополнительные сведения см. в reentrancy_guard разделе Authoring.mdFor more information on reentrancy_guard see authoring.md

Данные конфигурацииConfiguration data

Если вы хотите добавить данные конфигурации в исправление среды выполнения, рассмотрите возможность его добавления в config.json .If you want to add configuration data to your runtime fix, consider adding it to the config.json. Таким образом, можно использовать FixupQueryCurrentDllConfig для простого анализа этих данных.That way, you can use the FixupQueryCurrentDllConfig to easily parse that data. В этом примере анализируется логическое и строковое значения из этого файла конфигурации.This example parses a boolean and string value from that configuration file.

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();
    }
}

Адресная привязка метаданныхFixup metadata

Каждая адресная привязка и приложение запуска ПСФ имеют XML-файл метаданных, содержащий следующие сведения:Each fixup and the PSF Launcher application has an XML metadata file that contains the following information:

  • Версия. версия ПСФ является основной. Дополнительный. Формат исправления в соответствии с SEM версии 2.Version: The version of the PSF is in MAJOR.MINOR.PATCH format according to Sem Version 2.
  • Минимальная платформа Windows: Минимальная версия Windows, необходимая для программы запуска исправления или ПСФ.Minimum Windows Platform: The minimum windows version required for the fixup or PSF Launcher.
  • Описание: краткое описание исправления.Description: A short description of the fixup.
  • Вхентаусе: эвристика, когда необходимо применить исправление.WhenToUse: Heuristics on when you should apply the fixup.

Пример см. в файле метаданных филередиректионфиксупметадата. XML для исправления перенаправления.For an example, see the FileRedirectionFixupMetadata.xml metadata file for the redirection fixup. Схема метаданных доступна здесь.The metadata schema is available here.