Set WINDOWS API

Penting

Info dalam topik ini berlaku untuk semua versi Windows 10, dan yang lebih baru. Kita akan menyebut versi tersebut di sini sebagai "Windows", memanggil pengecualian apa pun jika perlu.

Semua versi Windows berbagi komponen dasar sistem operasi (OS) umum yang disebut OS inti (dalam beberapa konteks basis umum ini juga disebut OneCore). Dalam komponen OS inti, API Win32 diatur ke dalam grup fungsional yang disebut set API.

Tujuan dari set API adalah untuk memberikan pemisahan arsitektur dari DLL host tempat API Win32 tertentu diimplementasikan, dan kontrak fungsional tempat API berada. Pemisahan yang disediakan set API antara implementasi dan kontrak menawarkan banyak keuntungan rekayasa bagi pengembang. Secara khusus, menggunakan set API dalam kode Anda dapat meningkatkan kompatibilitas dengan perangkat Windows.

Set API secara khusus membahas skenario berikut:

  • Meskipun luas penuh API Win32 didukung pada PC, hanya subset API Win32 yang tersedia di perangkat Windows lainnya seperti HoloLens, Xbox, dan perangkat lainnya. Nama set API menyediakan mekanisme kueri untuk mendeteksi dengan bersih apakah API tersedia di perangkat tertentu.

  • Beberapa implementasi API Win32 ada di DLL dengan nama yang berbeda di berbagai perangkat Windows. Menggunakan nama set API alih-alih nama DLL saat mendeteksi ketersediaan API dan API pemuatan penundaan memberikan rute yang benar ke implementasi di mana pun API benar-benar diterapkan.

Untuk detail selengkapnya, lihat operasi pemuat set API dan Mendeteksi ketersediaan set API.

Apakah set API dan dll adalah hal yang sama?

Tidak—nama set API adalah alias virtual untuk file fisik .dll . Ini adalah teknik persembunyian implementasi, di mana Anda sebagai pemanggil tidak perlu tahu persis modul mana yang menghosting informasi.

Teknik ini memungkinkan modul untuk direfaktor (terpisah, dikonsolidasikan, diganti namanya, dan sebagainya) pada versi dan edisi Windows yang berbeda. Dan aplikasi Anda masih menautkan, dan masih dirutekan ke kode yang benar saat runtime.

Jadi mengapa set API memiliki .dll atas namanya? Alasannya adalah cara loader DLL diimplementasikan. Loader adalah bagian dari OS yang memuat DLL dan/atau menyelesaikan referensi ke DLL. Dan di ujung depan, loader memerlukan string apa pun yang diteruskan ke LoadLibrary untuk dihentikan dengan ".dll". Tetapi setelah ujung depan itu, loader dapat menghapus akhiran tersebut, dan mengkueri database set API dengan string yang dihasilkan.

LoadLibrary (dan beban penundaan) berhasil dengan nama set API (dengan ".dll" di dalamnya); tetapi belum tentu ada file aktual dengan nama tersebut di mana saja di PC.

Menautkan pustaka payung

Untuk mempermudah pembatasan kode Anda ke API Win32 yang didukung di OS inti, kami menyediakan serangkaian pustaka payung. Misalnya, pustaka payung bernama OneCore.lib menyediakan ekspor untuk subset API Win32 yang umum untuk semua perangkat Windows.

Untuk detail selengkapnya, lihat Pustaka payung Windows.

Nama kontrak set API

Set API diidentifikasi dengan nama kontrak yang kuat yang mengikuti konvensi standar ini yang dikenali oleh pemuat pustaka.

  • Nama harus dimulai dengan string api- atau ext-.
    • Nama yang dimulai dengan api- mewakili API yang dijamin ada di semua versi Windows.
    • Nama yang dimulai dengan ext- mewakili API yang mungkin tidak ada di semua versi Windows.
  • Nama harus diakhir dengan urutan l n-n-n<<>>>, di mana n terdiri dari digit desimal.<
  • Isi nama dapat berupa karakter alfanumerik, atau tanda hubung (-).
  • Nama tidak peka huruf besar/kecil.

Berikut adalah beberapa contoh nama kontrak set API:

  • api-ms-win-core-ums-l1-1-0
  • ext-ms-win-com-ole32-l1-1-5
  • ext-ms-win-ntuser-window-l1-1-0
  • ext-ms-win-ntuser-window-l1-1-1

Anda dapat menggunakan nama set API dalam konteks operasi pemuat seperti LoadLibrary atau P/Invoke alih-alih nama modul DLL untuk memastikan rute yang benar ke implementasi di mana pun API benar-benar diterapkan pada perangkat saat ini. Namun, ketika Anda melakukan ini, Anda harus menambahkan string .dll di akhir nama kontrak. Ini adalah persyaratan loader untuk berfungsi dengan baik, dan tidak dianggap sebagai bagian dari nama kontrak. Meskipun nama kontrak tampak mirip dengan nama DLL dalam konteks ini, nama tersebut pada dasarnya berbeda dari nama modul DLL dan tidak langsung merujuk ke file pada disk.

Kecuali untuk menambahkan string .dll dalam operasi pemuat, nama kontrak set API harus dianggap sebagai pengidentifikasi yang tidak dapat diubah yang sesuai dengan versi kontrak tertentu.

Mengidentifikasi set API untuk API Win32

Untuk mengidentifikasi apakah API Win32 tertentu milik set API, tinjau tabel persyaratan dalam dokumentasi referensi untuk API. Jika API milik set API, tabel persyaratan dalam artikel mencantumkan nama set API dan versi Windows tempat API pertama kali diperkenalkan ke set API. Untuk contoh API yang termasuk dalam set API, lihat artikel berikut:

Di bagian ini