Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.