Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wenn für Ihr Problem keine Laufzeitkorrektur vorhanden ist, können Sie eine neue Laufzeitkorrektur erstellen, indem Sie Ersetzungsfunktionen schreiben und alle Konfigurationsdaten einschließen, die sinnvoll sind. Sehen wir uns die einzelnen Teile an.
Ersetzungsfunktionen
Identifizieren Sie zunächst, welche Funktionsaufrufe fehlschlagen, wenn Ihre Anwendung in einem MSIX-Container ausgeführt wird. Anschließend können Sie Ersetzungsfunktionen erstellen, die stattdessen vom Laufzeit-Manager aufgerufen werden sollen. Dadurch erhalten Sie die Möglichkeit, die Implementierung einer Funktion durch verhalten zu 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 die fixup_framework.h am Anfang jeder .CPP-Datei hinzu, in der Sie die Funktionen Ihres Laufzeitfixes hinzufügen möchten.
#define FIXUP_DEFINE_EXPORTS
#include <fixup_framework.h>
Von Bedeutung
Stellen Sie sicher, dass das FIXUP_DEFINE_EXPORTS Makro vor der include-Anweisung angezeigt wird.
Erstellen Sie eine Funktion, die dieselbe Signatur der Funktion aufweist, die das Verhalten aufweist, das 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 von DECLARE_FIXUP ordnet die Funktion MessageBoxW Ihrer neuen Ersetzungsfunktion zu. 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 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 erzeugen. Ihre Implementierung ruft die CopyFile Funktion möglicherweise auf, 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 reentrancy_guard finden Sie unter authoring.md
Konfigurationsdaten
Wenn Sie Ihrem Laufzeit-Fix Konfigurationsdaten hinzufügen möchten, sollten Sie diese der config.json-Datei hinzufügen. Auf diese Weise können Sie diese FixupQueryCurrentDllConfig verwenden, um die Daten einfach zu analysieren. In diesem Beispiel wird ein boolescher Wert und ein 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();
}
}
Metadatenberichtigen
Jedes Fixup und die PSF-Startprogrammanwendung verfügt über eine XML-Metadatendatei, die die folgenden Informationen enthält:
- Version: Die Version der PSF ist in MAJOR.MINOR.PATCH-Format gemäß Sem Version 2.
- Minimale Windows-Plattform: Die mindeste Windows-Version, die für das Fixup oder das PSF-Startprogramm erforderlich ist.
- Beschreibung: Eine kurze Beschreibung des Fixups.
- Wann zu verwenden: Heuristiken, wann Sie die Anpassung vornehmen sollten.
Ein Beispiel finden Sie in der FileRedirectionFixupMetadata.xml Metadatendatei für das Umleitungs-Fixup. Das Metadatenschema ist hier verfügbar.