Creación de una corrección para el marco de compatibilidad de paquete
Si no hay ninguna corrección en tiempo de ejecución para el problema, puedes crear una nueva corrección en tiempo de ejecución escribiendo funciones de reemplazo e incluyendo los datos de configuración que tengan sentido. Miremos cada parte.
Funciones de reemplazo
Primero, tienes que identificar qué llamadas de función provocan un error cuando la aplicación se ejecuta en un contenedor de MSIX. Después, puedes crear funciones de reemplazo a las que te gustaría que llamara el administrador de tiempo de ejecución. Esto ofrece la oportunidad de reemplazar la implementación de una función por un comportamiento que se ajuste a las reglas del entorno de tiempo de ejecución moderno.
Declara la macro FIXUP_DEFINE_EXPORTS
y agrega una instrucción include para fixup_framework.h
en la parte superior de cada . archivo CPP en el que pretendes agregar las funciones de la corrección en tiempo de ejecución.
#define FIXUP_DEFINE_EXPORTS
#include <fixup_framework.h>
Importante
Asegúrate de que la macro FIXUP_DEFINE_EXPORTS
aparece antes de la instrucción include.
Crea una función que tenga la misma firma de la función que deseas modificar. Esta es una función de ejemplo que reemplaza a la función 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);
La llamada a DECLARE_FIXUP
asigna la función MessageBoxW
a la nueva función de reemplazo. Cuando la aplicación intenta llamar a la función MessageBoxW
, llamará a la función de reemplazo en su lugar.
Protección contra llamadas recursivas a funciones en correcciones en tiempo de ejecución
El tipo reentrancy_guard
se puede agregar a las funciones para protegerlas frente a llamadas de función recursivas.
Por ejemplo, podrías generar una función de reemplazo para la función CreateFile
. La implementación podría llamar a la función CopyFile
, pero la implementación de la función CopyFile
podría llamar a la función CreateFile
. Esto puede provocar un ciclo recursivo infinito de llamadas a la función CreateFile
.
Para obtener más información sobre reentrancy_guard
, consulte authoring.md
Datos de configuración
Si deseas agregar datos de configuración a la corrección en tiempo de ejecución, considera la posibilidad de agregarlos a config.json
. De este modo, puedes usar FixupQueryCurrentDllConfig
para analizar fácilmente esos datos. En este ejemplo se analiza un valor booleano y de cadena de ese archivo de configuración.
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();
}
}
Metadatos de corrección
Cada corrección y la aplicación del iniciador de PSF tienen un archivo de metadatos XML que contiene la siguiente información:
- Versión: la versión de PSF está en formato MAJOR.MINOR.PATCH según sem versión 2.
- Plataforma mínima de Windows: la versión mínima de Windows necesaria para la corrección o el iniciador de PSF.
- Descripción: una descripción corta de la corrección.
- WhenToUse: heurística sobre cuándo debes aplicar la corrección.
Para obtener un ejemplo, consulta el archivo de metadatos FileRedirectionFixupMetadata.xml para la corrección de redireccionamiento. El esquema de metadatos está disponible aquí.