Criar a correção do Package Support FrameworkCreate a Package Support Framework fixup

Se não houver correção de tempo de execução para o problema, você poderá criar uma nova correção de tempo de execução escrevendo funções de substituição e incluindo quaisquer dados de configuração que façam sentido.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. Vamos examinar cada parte.Let's look at each part.

Funções de substituiçãoReplacement functions

Primeiro, identifique quais chamadas de função falham quando seu aplicativo é executado em um contêiner MSIX.First, identify which function calls fail when your application runs in an MSIX container. Em seguida, você poderá criar funções de substituição que você deseja que sejam chamadas pelo gerenciador de runtime.Then, you can create replacement functions that you'd like the runtime manager to call instead. 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.This gives you an opportunity to replace the implementation of a function with behavior that conforms to the rules of the modern runtime environment.

Declare a FIXUP_DEFINE_EXPORTS macro e, em seguida, adicione uma instrução include para a fixup_framework.h na parte superior de cada uma. Arquivo CPP no qual você pretende adicionar as funções de sua correção de tempo de execução.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>

Importante

Verifique se a FIXUP_DEFINE_EXPORTS macro aparece antes da instrução include.Make sure that the FIXUP_DEFINE_EXPORTS macro appears before the include statement.

Crie uma função que tenha a mesma assinatura da função que é o comportamento que você deseja modificar.Create a function that has the same signature of the function who's behavior you want to modify. Aqui está uma função de exemplo que substitui a MessageBoxW função.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);

A chamada para DECLARE_FIXUP mapeia a MessageBoxW função para a nova função de substituição.The call to DECLARE_FIXUP maps the MessageBoxW function to your new replacement function. Quando o aplicativo tentar chamar a MessageBoxW função, ele chamará a função de substituição em vez disso.When your application attempts to call the MessageBoxW function, it will call the replacement function instead.

Proteger contra chamadas recursivas para funções em correções de tempo de execuçãoProtect against recursive calls to functions in runtime fixes

O reentrancy_guard tipo pode ser adicionado às suas funções para protegê-los contra chamadas de função recursivas.The reentrancy_guard type can be added to your functions to protect them against recursive function calls.

Por exemplo, você pode produzir uma função de substituição para a CreateFile função.For example, you might produce a replacement function for the CreateFile function. Sua implementação pode chamar a CopyFile função, mas a implementação da CopyFile função pode chamar a CreateFile função.Your implementation might call the CopyFile function, but the implementation of the CopyFile function might call the CreateFile function. Isso pode levar a um ciclo recursivo infinito de chamadas para a CreateFile função.This may lead to an infinite recursive cycle of calls to the CreateFile function.

Para obter mais informações sobre o, reentrancy_guard consulte Authoring.MDFor more information on reentrancy_guard see authoring.md

Dados de configuraçãoConfiguration data

Se você quiser adicionar dados de configuração à correção de tempo de execução, considere adicioná-los ao config.json .If you want to add configuration data to your runtime fix, consider adding it to the config.json. Dessa forma, você pode usar o FixupQueryCurrentDllConfig para analisar facilmente esses dados.That way, you can use the FixupQueryCurrentDllConfig to easily parse that data. Este exemplo analisa um valor booliano e de cadeia de caracteres desse arquivo de configuração.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();
    }
}

Metadados de correçãoFixup metadata

Cada correção e o aplicativo iniciador PSF tem um arquivo de metadados XML que contém as seguintes informações:Each fixup and the PSF Launcher application has an XML metadata file that contains the following information:

  • Versão: a versão do PSF está em MAJOR. Secundária. Formato de PATCH de acordo com sem versão 2.Version: The version of the PSF is in MAJOR.MINOR.PATCH format according to Sem Version 2.
  • Plataforma mínima do Windows: a versão mínima do Windows necessária para a correção ou o inicializador PSF.Minimum Windows Platform: The minimum windows version required for the fixup or PSF Launcher.
  • Descrição: uma breve descrição da correção.Description: A short description of the fixup.
  • WhenToUse: heurística sobre quando você deve aplicar a correção.WhenToUse: Heuristics on when you should apply the fixup.

Para obter um exemplo, consulte o arquivo de metadados FileRedirectionFixupMetadata. xml para a correção de redirecionamento.For an example, see the FileRedirectionFixupMetadata.xml metadata file for the redirection fixup. O esquema de metadados está disponível aqui.The metadata schema is available here.