Erstellen einer Fehlerbehebung mit dem Framework zur Paketunterstützung

Wenn kein Laufzeitkorrektur für Ihr Problem vorliegt, können Sie eine neue Laufzeitkorrektur erstellen, indem Sie Ersatzfunktionen schreiben und alle Konfigurationsdaten einschließen, die sinnvoll sind. Sehen wir uns jeden Teil an.

Ersetzungsfunktionen

Identifizieren Sie zunächst, welche Funktionsaufrufe fehlschlagen, wenn Ihre Anwendung in einem MSIX-Container ausgeführt wird. Anschließend können Sie Ersatzfunktionen erstellen, die der Runtime-Manager stattdessen aufrufen soll. Dadurch können Sie die Implementierung einer Funktion durch ein Verhalten ersetzen, das den Regeln der modernen Laufzeitumgebung entspricht.

Deklarieren Sie das FIXUP_DEFINE_EXPORTS Makro, und fügen Sie dann eine Include-Anweisung für den fixup_framework.h oberen Bereich der einzelnen Elemente hinzu. CPP-Datei, in der Sie die Funktionen Ihres Laufzeitfixes hinzufügen möchten.

#define FIXUP_DEFINE_EXPORTS
#include <fixup_framework.h>

Wichtig

Stellen Sie sicher, dass das FIXUP_DEFINE_EXPORTS Makro vor der Include-Anweisung angezeigt wird.

Erstellen Sie eine Funktion, die dieselbe Signatur der Funktion hat, deren Verhalten Sie ändern möchten. Hier ist eine Beispielfunktion, die die MessageBoxW Funktion ersetzt.

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

Der Aufruf der DECLARE_FIXUPMessageBoxW Funktion wird Ihrer neuen Ersatzfunktion zugeordnet. Wenn Ihre Anwendung versucht, die MessageBoxW Funktion aufzurufen, ruft sie stattdessen die Ersetzungsfunktion auf.

Schutz vor rekursiven Aufrufen von Funktionen in Laufzeitkorrekturen

Der reentrancy_guard Typ kann Zu Ihren Funktionen hinzugefügt werden, um sie vor rekursiven Funktionsaufrufen zu schützen.

Sie können z. B. eine Ersatzfunktion für die CreateFile Funktion erstellen. Ihre Implementierung kann die CopyFile Funktion aufrufen, aber die Implementierung der CopyFile Funktion kann die CreateFile Funktion aufrufen. Dies kann zu einem unendlichen rekursiven Zyklus von Aufrufen der CreateFile Funktion führen.

Weitere Informationen finden reentrancy_guard Sie unter authoring.md

Konfigurationsdaten

Wenn Sie Ihrer Laufzeitkorrektur Konfigurationsdaten hinzufügen möchten, sollten Sie sie dem config.jsonHinzufügen hinzufügen. Auf diese Weise können Sie diese FixupQueryCurrentDllConfig Daten einfach analysieren. In diesem Beispiel wird ein boolescher und Zeichenfolgenwert aus dieser Konfigurationsdatei analysiert.

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

Fixupmetadaten

Jedes Fixup und die PSF-Startprogrammanwendung verfügt über eine XML-Metadatendatei, die die folgenden Informationen enthält:

  • Version: Die Version der PSF befindet sich in MAJOR. KLEINER. PATCH-Format gemäß Sem Version 2.
  • Mindest-Windows-Plattform: Die mindeste Windows-Version, die für das Fixup oder das PSF-Startprogramm erforderlich ist.
  • Beschreibung: Eine kurze Beschreibung des Fixups.
  • WhenToUse: Heuristics on when you should apply the fixup.

Ein Beispiel finden Sie in der FileRedirectionFixupMetadata.xml Metadatendatei für die Umleitungskorrektur. Das Metadatenschema ist hier verfügbar.