Udostępnij przez


Tworzenie poprawki struktury obsługi pakietów

Jeśli problem nie zostanie naprawiony przez środowisko uruchomieniowe, możesz utworzyć nową poprawkę środowiska uruchomieniowego, zapisując funkcje zastępcze i uwzględniając wszelkie sensowne dane konfiguracji. Przyjrzyjmy się każdej części.

Funkcje zastępcze

Najpierw zidentyfikuj, które wywołania funkcji kończą się niepowodzeniem, gdy aplikacja działa w kontenerze MSIX. Następnie możesz utworzyć funkcje zastępcze, które chciałbyś, aby były wywoływane przez menedżera środowiska uruchomieniowego. Dzięki temu można zastąpić implementację funkcji zachowaniem zgodnym z regułami nowoczesnego środowiska uruchomieniowego.

Zadeklaruj makro FIXUP_DEFINE_EXPORTS, a następnie dodaj instrukcję include na początku każdego pliku .CPP, w którym zamierzasz dodać funkcje swojej poprawki wykonawczej.

#define FIXUP_DEFINE_EXPORTS
#include <fixup_framework.h>

Ważne

Upewnij się, że makro FIXUP_DEFINE_EXPORTS pojawia się przed instrukcją dołączania.

Utwórz funkcję, która ma ten sam podpis funkcji, która ma zachowanie, które chcesz zmodyfikować. Oto przykładowa funkcja, która zastępuje MessageBoxW funkcję.

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

Wywołanie DECLARE_FIXUP przypisuje funkcję MessageBoxW do twojej nowej funkcji zastępczej. Gdy aplikacja podejmie próbę wywołania funkcji MessageBoxW, wywoła funkcję zastępczą.

Ochrona przed rekursywnymi wywołaniami funkcji w poprawkach środowiska uruchomieniowego

Typ reentrancy_guard można dodać do funkcji, aby chronić je przed rekursywnymi wywołaniami funkcji.

Na przykład można utworzyć funkcję zastępczą dla CreateFile funkcji . Implementacja może wywołać funkcję CopyFile, ale implementacja funkcji CopyFile może wywołać funkcję CreateFile. Może to prowadzić do nieskończonego cyklu cyklicznego wywołań CreateFile funkcji.

Aby uzyskać więcej informacji reentrancy_guard zobacz authoring.md

Dane konfiguracji

Jeśli chcesz dodać dane konfiguracji do poprawki środowiska uruchomieniowego, rozważ dodanie ich do pliku config.json. Dzięki temu możesz FixupQueryCurrentDllConfig łatwo analizować te dane. W tym przykładzie analizuje wartość logiczną i ciągową z tego pliku konfiguracji.

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

Popraw metadane

Każda poprawka oraz aplikacja PSF Launcher mają plik metadanych XML, który zawiera następujące informacje:

  • Wersja: Wersja PSF jest w formacie MAJOR.MINOR.PATCH zgodnie z Sem Version 2.
  • Minimalna wersja platformy Windows: minimalna wersja systemu Windows wymagana dla poprawki lub modułu uruchamiania PSF.
  • Opis: Krótki opis naprawy.
  • WhenToUse: Heurystyka, kiedy należy zastosować poprawkę.

Aby zapoznać się z przykładem, zobacz plik metadanych FileRedirectionFixupMetadata.xml dotyczący poprawki przekierowania. Schemat metadanych jest dostępny tutaj.