Membuat perbaikan Kerangka Kerja Dukungan Paket

Jika tidak ada perbaikan runtime untuk masalah Anda, Anda dapat membuat perbaikan runtime baru dengan menulis fungsi penggantian dan menyertakan data konfigurasi apa pun yang masuk akal. Mari kita lihat setiap bagian.

Fungsi penggantian

Pertama, identifikasi panggilan fungsi mana yang gagal saat aplikasi Anda berjalan dalam kontainer MSIX. Kemudian, Anda dapat membuat fungsi pengganti yang ingin Anda panggil manajer runtime sebagai gantinya. Ini memberi Anda kesempatan untuk mengganti implementasi fungsi dengan perilaku yang sesuai dengan aturan lingkungan runtime modern.

Deklarasikan makro FIXUP_DEFINE_EXPORTS, lalu tambahkan pernyataan include fixup_framework.h di bagian atas setiap file .cpp tempat Anda ingin menambahkan fungsi perbaikan runtime.

#define FIXUP_DEFINE_EXPORTS
#include <fixup_framework.h>

Penting

Pastikan makro FIXUP_DEFINE_EXPORTS muncul sebelum pernyataan sertakan.

Buat fungsi yang memiliki tanda tangan fungsi yang sama dengan fungsi yang perilakunya ingin Anda ubah. Berikut adalah contoh fungsi yang menggantikan MessageBoxW fungsi .

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

Panggilan ke DECLARE_FIXUP memetakan fungsi MessageBoxW ke fungsi pengganti baru Anda. Ketika aplikasi Anda mencoba memanggil MessageBoxW fungsi, aplikasi akan memanggil fungsi pengganti sebagai gantinya.

Melindungi dari panggilan rekursif ke fungsi dalam perbaikan runtime

reentrancy_guard tipe dapat ditambahkan ke fungsi Anda untuk melindunginya dari panggilan fungsi rekursif.

Misalnya, Anda dapat menghasilkan fungsi pengganti untuk fungsi tersebut CreateFile . Implementasi Anda mungkin memanggil CopyFile fungsi, tetapi implementasi CopyFile fungsi mungkin memanggil CreateFile fungsi . Ini dapat menyebabkan siklus panggilan rekursif tak terbatas ke CreateFile fungsi.

Untuk informasi selengkapnya tentang reentrancy_guard lihat authoring.md

Data konfigurasi

Jika Anda ingin menambahkan data konfigurasi ke perbaikan runtime Anda, pertimbangkan untuk menambahkannya ke config.json. Dengan begitu, Anda dapat menggunakan FixupQueryCurrentDllConfig untuk mengurai data tersebut dengan mudah. Contoh ini menguraikan nilai boolean dan string dari file konfigurasi tersebut.

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

Memperbaiki metadata

Setiap perbaikan dan aplikasi Peluncur PSF memiliki file metadata XML yang berisi informasi berikut:

  • Versi: Versi PSF menggunakan format MAJOR.MINOR.PATCH sesuai dengan Sem Version 2.
  • Platform Windows Minimum: Versi Windows minimum yang diperlukan untuk perbaikan atau Peluncur PSF.
  • Deskripsi: Deskripsi singkat tentang perbaikan.
  • WhenToUse: Heuristik tentang kapan Anda harus menerapkan perbaikan.

Sebagai contoh, lihat file metadata FileRedirectionFixupMetadata.xml untuk perbaikan pengalihan. Skema metadata tersedia di sini.