Criar a correção do Package Support Framework

Se não houver correção de runtime para o problema, você poderá criar uma nova correção de runtime escrevendo funções de substituição e incluindo quaisquer dados de configuração que faça sentido. Vamos examinar cada parte.

Funções de substituição

Primeiro, identifique quais chamadas de função falharão quando seu aplicativo for executado em um contêiner MSIX. Em seguida, você poderá criar funções de substituição que você deseja que sejam chamadas pelo gerenciador de runtime. Isso oferecerá uma oportunidade de substituir a implementação de uma função por um comportamento que esteja de acordo com as regras do ambiente moderno do runtime.

Declare a FIXUP_DEFINE_EXPORTS macro e adicione uma instrução include para a fixup_framework.h parte superior de cada . Arquivo CPP no qual você pretende adicionar as funções da correção do runtime.

#define FIXUP_DEFINE_EXPORTS
#include <fixup_framework.h>

Importante

Verifique se a FIXUP_DEFINE_EXPORTS macro é exibida antes da instrução include.

Crie uma função que tenha a mesma assinatura da função que o comportamento que você deseja modificar. Aqui está uma função de exemplo que substitui a MessageBoxW função.

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

A chamada para DECLARE_FIXUP mapear a MessageBoxW função para sua nova função de substituição. Quando o aplicativo tentar chamar a MessageBoxW função, ele chamará a função de substituição.

Proteger contra chamadas recursivas para funções em correções de runtime

O reentrancy_guard tipo pode ser adicionado às suas funções para protegê-las contra chamadas de função recursivas.

Por exemplo, você pode produzir uma função de substituição para a CreateFile função. Sua implementação pode chamar a CopyFile função, mas a implementação da CopyFile função pode chamar a CreateFile função. Isso pode levar a um ciclo recursivo infinito de chamadas para a CreateFile função.

Para obter mais informações sobre reentrancy_guardauthoring.md

Dados de configuração

Se você quiser adicionar dados de configuração à correção do runtime, considere adicioná-los ao config.json. Dessa forma, você pode usar para FixupQueryCurrentDllConfig analisar facilmente esses dados. Este exemplo analisa um valor booliano e de cadeia de caracteres desse arquivo de configuração.

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

Corrigir metadados

Cada correção e o aplicativo PSF Launcher têm um arquivo de metadados XML que contém as seguintes informações:

  • Versão: a versão do PSF está em MAJOR. MENOR. Formato PATCH de acordo com a Sem Versão 2.
  • Plataforma Mínima do Windows: a versão mínima do Windows necessária para a correção ou inicializador PSF.
  • Descrição: uma breve descrição da correção.
  • WhenToUse: Heurística sobre quando você deve aplicar a correção.

Para obter um exemplo, consulte o arquivo de metadadosFileRedirectionFixupMetadata.xml para a correção de redirecionamento. O esquema de metadados está disponível aqui.