Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Si no hay ninguna corrección en tiempo de ejecución para el problema, puede crear una nueva corrección en tiempo de ejecución escribiendo funciones de reemplazo e incluyendo los datos de configuración que tenga sentido. Echemos un vistazo a cada parte.
Funciones de reemplazo
En primer lugar, identifique qué llamadas a función producen un error cuando la aplicación se ejecuta en un contenedor MSIX. Después, puede crear funciones de reemplazo a las que le 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.
Declare la FIXUP_DEFINE_EXPORTS macro y luego agregue una instrucción include para fixup_framework.h en la parte superior de cada archivo .CPP en el que pretenda agregar las funciones de la corrección en tiempo de ejecución.
#define FIXUP_DEFINE_EXPORTS
#include <fixup_framework.h>
Importante
Asegúrese de que la FIXUP_DEFINE_EXPORTS macro aparece antes de la instrucción include.
Cree una función que tenga la misma firma que la de la función cuyo comportamiento desea modificar. Esta es una función de ejemplo que reemplaza a la MessageBoxW función .
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 tu nueva función de reemplazo. Cuando la aplicación intenta llamar a la MessageBoxW función , 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 reentrancy_guard tipo se puede agregar a tus funciones para protegerlas frente a llamadas recursivas de funciones.
Por ejemplo, podría generar una función de reemplazo para la CreateFile función . La implementación podría llamar a la función CopyFile, pero la función CopyFile podría llamar a la función CreateFile. Esto puede provocar un ciclo recursivo infinito de llamadas a la CreateFile función.
Para obtener más información sobre reentrancy_guard, consulte authoring.md
Datos de configuración
Si desea agregar datos de configuración a la corrección en tiempo de ejecución, considere la posibilidad de agregarlos a config.json. De este modo, puede 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();
}
}
Ajustar metadatos
Cada corrección y la aplicación del lanzador PSF tiene un archivo de metadatos XML que contiene la siguiente información:
- Versión: La versión de PSF está en el 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 breve descripción del ajuste.
- WhenToUse: heurísticas sobre cuándo debería aplicar la corrección.
Para obtener un ejemplo, consulte el archivo de metadatos FileRedirectionFixupMetadata.xml para el ajuste de redirección. El esquema de metadatos está disponible aquí.