Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Если для проблемы нет исправления среды выполнения, можно создать новое исправление среды выполнения, написав функции замены и включив все данные конфигурации, которые имеют смысл. Рассмотрим каждую часть.
Функции замены
Сначала определите, какие вызовы функций завершаются сбоем при запуске приложения в контейнере 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.MINOR.PATCH в соответствии с Sem Version 2.
- Минимальная платформа Windows: минимальная версия windows, необходимая для исправления или средства запуска PSF.
- Описание: краткое описание исправления.
- WhenToUse: Рекомендации, когда следует применять исправление.
Пример см. в файле метаданных FileRedirectionFixupMetadata.xml для исправления перенаправления. Схема метаданных доступна здесь.