Bagikan melalui


Mendaftarkan Antarmuka

Bagian ini menyajikan diskusi terperinci tentang proses pendaftaran antarmuka RPC.

Informasi di bagian ini disajikan dalam topik berikut:

Fungsi Pendaftaran Antarmuka

Server mendaftarkan antarmuka mereka dengan memanggil fungsi RpcServerRegisterIf. Program server kompleks sering mendukung lebih dari satu antarmuka. Aplikasi server harus memanggil fungsi ini sekali untuk setiap antarmuka yang mereka dukung.

Selain itu, server dapat mendukung beberapa versi antarmuka yang sama, masing-masing dengan implementasi fungsi antarmukanya sendiri. Jika program server Anda melakukan ini, program harus menyediakan sekumpulan titik masuk. Titik masuk adalah rutinitas manajer yang mengirimkan panggilan untuk versi antarmuka. Harus ada satu titik masuk untuk setiap versi antarmuka. Grup titik masuk disebut vektor titik masuk. Untuk detailnya, lihat Entry-Point Vektor.

Selain fungsi standar RpcServerRegisterIf, RPC juga mendukung fungsi pendaftaran antarmuka lainnya. FungsiRpcServerRegisterIf2 memperluas kemampuan RpcServerRegisterIf dengan memungkinkan Anda menentukan serangkaian bendera pendaftaran (lihat bendera Pendaftaran Antarmuka ), jumlah maksimum permintaan panggilan prosedur jarak jauh bersamaan yang dapat diterima server, dan ukuran maksimum dalam byte blok data masuk.

Pustaka RPC juga berisi fungsi yang disebut RpcServerRegisterIfEx. Seperti fungsiRpcServerRegisterIf, fungsi ini mendaftarkan antarmuka. Program server Anda juga dapat menggunakan fungsi ini untuk menentukan serangkaian bendera pendaftaran (lihat Bendera Pendaftaran Antarmuka), jumlah maksimum permintaan panggilan prosedur jarak jauh bersamaan yang dapat diterima server, dan fungsi panggilan balik keamanan.

Fungsi RpcServerRegisterIf, RpcServerRegisterIfEx, dan RpcServerRegisterIf2 menetapkan nilai dalam tabel registri antarmuka internal. Tabel ini digunakan untuk memetakan antarmuka UUID dan UUID objek ke manajer EPV. Manajer EPV adalah array penunjuk fungsi yang berisi tepat satu penunjuk fungsi untuk setiap prototipe fungsi dalam antarmuka yang ditentukan dalam file IDL.

Untuk informasi tentang menyediakan beberapa EPV untuk menyediakan beberapa implementasi antarmuka, lihat Beberapa Implementasi Antarmuka.

Pustaka run-time menggunakan tabel registri antarmuka (diatur melalui panggilan ke fungsi RpcServerRegisterIf, RpcServerRegisterIfEx, atau RpcServerRegisterIf2) dan tabel registri objek (diatur melalui panggilan ke fungsi RpcObjectSetType) untuk memetakan antarmuka dan UUID objek ke penunjuk fungsi.

Saat Anda ingin program server Anda menghapus antarmuka dari registri pustaka run-time RPC, panggil fungsi RpcServerUnregisterIf. Setelah antarmuka dihapus dari registri, pustaka run-time RPC tidak akan lagi menerima panggilan baru untuk antarmuka tersebut.

Vektor titik masuk

Vektor titik entri manajer (EPV) adalah array penunjuk fungsi yang menunjuk ke implementasi fungsi yang ditentukan dalam file IDL. Jumlah elemen dalam array sesuai dengan jumlah fungsi yang ditentukan dalam file IDL. RPC mendukung beberapa vektor titik masuk yang mewakili beberapa implementasi fungsi yang ditentukan dalam antarmuka.

Kompilator MIDL secara otomatis menghasilkan jenis data EPV manajer untuk digunakan dalam membangun EPV manajer. Jenis data diberi nama if-name **_SERVER_EPV**, di mana if-name menentukan pengidentifikasi antarmuka dalam file IDL.

Kompilator MIDL secara otomatis membuat dan menginisialisasi EPV manajer default dengan asumsi bahwa rutinitas manajer dengan nama yang sama ada untuk setiap prosedur dalam antarmuka dan ditentukan dalam file IDL.

Ketika server menawarkan beberapa implementasi antarmuka yang sama, server harus membuat satu EPV manajer tambahan untuk setiap implementasi. Setiap EPV harus berisi tepat satu titik entri (alamat fungsi) untuk setiap prosedur yang ditentukan dalam file IDL. Aplikasi server mendeklarasikan dan menginisialisasi satu variabel EPV manajer jenis if-name**_SERVER_EPV** untuk setiap implementasi tambahan antarmuka. Untuk mendaftarkan EPV, ia memanggil RpcServerRegisterIf, RpcServerRegisterIfEx, atau RpcServerRegisterIf2 sekali untuk setiap jenis objek yang didukungnya.

Ketika klien melakukan panggilan prosedur jarak jauh ke server, EPV yang berisi penunjuk fungsi dipilih berdasarkan antarmuka UUID dan jenis objek. Jenis objek diturunkan dari UUID objek melalui fungsi penyelidikan objek atau pemetaan yang didorong tabel yang dikontrol oleh RpcObjectSetType.

Manajer EPV

Pada pengaturan awal, kompilator MIDL menggunakan nama prosedur dari berkas IDL antarmuka untuk menghasilkan manajer EPV, dan menempatkannya langsung ke dalam rangka server. EPV default ini diinisialisasi secara statis menggunakan nama prosedur yang dideklarasikan dalam definisi antarmuka.

Untuk mendaftarkan manajer menggunakan EPV default, tentukan NULL sebagai nilai parameter MgrEpv dalam panggilan ke fungsi RpcServerRegisterIf, RpcServerRegisterIfEx, atau RpcServerRegisterIf2. Jika nama rutin yang digunakan oleh manajer sesuai dengan definisi antarmuka, Anda dapat mendaftarkan manajer ini menggunakan EPV default antarmuka yang dihasilkan oleh pengkompilasi MIDL. Anda juga dapat mendaftarkan manajer menggunakan EPV yang disediakan aplikasi server.

Server dapat (dan terkadang harus) membuat dan mendaftarkan EPV manajernull non- untuk antarmuka. Untuk memilih EPV yang disediakan aplikasi server, berikan alamat EPV yang nilainya telah dideklarasikan oleh server sebagai nilai MgrEpv parameter. Nilainull non- untuk MgrEpv parameter selalu mengambil alih EPV default di stub server.

Kompilator MIDL secara otomatis menghasilkan jenis data EPV manajer (RPC_MGR_EPV) untuk digunakan aplikasi server dalam membangun EPV manajer. Manajer EPV harus berisi tepat satu titik masuk (alamat fungsi) untuk setiap prosedur yang ditentukan dalam file IDL.

Server harus menyediakan EPVnull non- dalam kasus berikut:

  • Ketika nama rutinitas manajer berbeda dari nama prosedur yang dideklarasikan dalam definisi antarmuka
  • Ketika server menggunakan EPV default untuk mendaftarkan implementasi lain dari antarmuka

Server mendeklarasikan manajer EPV dengan menginisialisasi variabel jenis if-name**_SERVER_EPV** untuk setiap implementasi antarmuka.

Mendaftarkan Satu Implementasi Antarmuka

Ketika server hanya menawarkan satu implementasi antarmuka, server memanggil RpcServerRegisterIf, RpcServerRegisterIfEx, atau RpcServerRegisterIf2 hanya sekali. Dalam kasus standar, server menggunakan manajer default EPV. (Pengecualiannya adalah ketika manajer menggunakan nama rutin yang berbeda dari yang dideklarasikan dalam antarmuka.)

Untuk kasus standar, Anda menyediakan nilai berikut untuk panggilan ke RpcServerRegisterIf, RpcServerRegisterIfEx, atau RpcServerRegisterIf2:

  • Manajer EPV

    Untuk menggunakan EPV default, tentukan nilai null untuk parameter MgrEpv.

  • UUID jenis manajer

    Saat menggunakan EPV default, daftarkan antarmuka dengan UUID jenis manajer nil dengan menyediakan nilai null atau UUID nihil untuk MgrTypeUuid parameter. Dalam hal ini, semua panggilan prosedur jarak jauh, terlepas dari UUID objek dalam pengikatnya, dikirim ke EPV default, dengan asumsi tidak ada panggilan RpcObjectSetType yang telah dilakukan.

    Anda juga dapat menyediakan UUID jenis manajer non-nil. Dalam hal ini, Anda juga harus memanggil rutinitas RpcObjectSetType.

Mendaftarkan Beberapa Implementasi Antarmuka

Anda dapat menyediakan lebih dari satu implementasi prosedur jarak jauh yang ditentukan dalam file IDL. Aplikasi server memanggil RpcObjectSetType untuk memetakan UUID objek ke UUID tipe dan memanggil RpcServerRegisterIf, RpcServerRegisterIfEx, atau RpcServerRegisterIf2 untuk mengaitkan EPV pengelola dengan UUID tipe. Ketika panggilan prosedur jarak jauh tiba dengan UUID objeknya, perpustakaan waktu proses dari server RPC memetakan UUID objek ke UUID jenis. Aplikasi server kemudian menggunakan UUID jenis dan antarmuka UUID untuk memilih manajer EPV.

Anda juga dapat menentukan fungsi Anda sendiri untuk menyelesaikan pemetaan dari UUID objek ke UUID jenis manajer. Anda menentukan fungsi pemetaan saat memanggil RpcObjectSetInqFn.

Untuk menawarkan beberapa implementasi antarmuka, server harus mendaftarkan setiap implementasi dengan memanggil RpcServerRegisterIf, RpcServerRegisterIfEx atau RpcServerRegisterIf2 secara terpisah. Untuk setiap implementasi yang didaftarkan server, server menyediakan ifSpec yang sama parameter, tetapi sepasang MgrTypeUuid dan MgrEpv parameter.

Dalam kasus beberapa manajer, gunakan RpcServerRegisterIf, RpcServerRegisterIfEx atau RpcServerRegisterIf2 sebagai berikut:

  • Manajer EPV

    Untuk menawarkan beberapa implementasi antarmuka, server harus:

    Perlu dicatat bahwa server dapat juga mendaftar dengan manajer default EPV.

  • UUID jenis manajer

    Berikan UUID tipe manajer untuk setiap EPV pada antarmuka. UUID jenis nihil (atau nilai null) untuk MgrTypeUuid parameter dapat ditentukan untuk salah satu EPV manajer. Setiap jenis UUID harus berbeda.

Aturan untuk Memanggil Rutinitas Manajer

Pustaka run-time RPC mengirimkan panggilan prosedur jarak jauh masuk ke manajer yang menawarkan antarmuka RPC yang diminta. Ketika beberapa manajer terdaftar untuk antarmuka, pustaka run-time RPC harus memilih salah satunya. Untuk memilih manajer, pustaka run-time RPC menggunakan UUID objek yang ditentukan oleh handle pengikatan panggilan.

Pustaka run-time menerapkan aturan berikut saat menginterpretasikan UUID objek dari panggilan prosedur jarak jauh:

  • UUID objek nihil

    UUID objek kosong secara otomatis ditetapkan sebagai UUID tipe kosong (tidak sah menetapkan UUID objek kosong dalam rutin RpcObjectSetType). Oleh karena itu, panggilan prosedur jarak jauh yang handle pengikatnya berisi UUID objek kosong secara otomatis dikirim ke manajer yang terdaftar dengan UUID tipe kosong, jika ada.

  • UUID objek bukan kosong

    Pada prinsipnya, panggilan prosedur jarak jauh yang handel pengikatannya berisi UUID objek non-nihil harus diproses oleh manajer yang jenis UUID-nya cocok dengan jenis UUID objek. Namun, mengidentifikasi manajer yang benar mengharuskan server telah menentukan jenis UUID objek tersebut dengan memanggil rutinitas RpcObjectSetType.

    Jika server gagal memanggil RpcObjectSetType rutin untuk UUID objek non-nihil, panggilan prosedur jarak jauh untuk UUID objek tersebut masuk ke EPV manajer yang layanan prosedur jarak jauh memanggil dengan UUID objek nihil (yaitu, UUID jenis nihil).

    Panggilan prosedur jarak jauh dengan UUID objek tidak-null dalam handle pengikatan tidak dapat dijalankan jika server menetapkan tipe UUID ke UUID objek tidak-null dengan memanggil fungsi RpcObjectSetType, tetapi juga tidak mendaftarkan pengelola EPV untuk tipe UUID tersebut dengan memanggil RpcServerRegisterIf, RpcServerRegisterIfEx, atau RpcServerRegisterIf2.

Tabel berikut ini meringkas tindakan yang digunakan pustaka run-time untuk memilih rutinitas manajer.

UUID objek panggilan Jenis konfigurasi server untuk UUID objek? Apakah server memiliki jenis EPV terdaftar? Tindakan pengiriman
Nihil Tidak berlaku Ya Menggunakan manajer dengan UUID tipe nil.
Nol Tidak berlaku Tidak Kesalahan (RPC_S_UNSUPPORTED_TYPE); menolak panggilan prosedur jarak jauh.
Non-nihil Ya Ya Menggunakan manajer dengan tipe UUID yang sama.
Non-nihil Tidak Diabaikan Menggunakan manajer dengan UUID jenis null. Jika tidak ada manajer dengan UUID tipe nol, terjadi kesalahan (RPC_S_UNSUPPORTEDTYPE); menolak panggilan prosedur jarak jauh.
Non-nihil Ya Tidak Kesalahan (RPC_S_UNSUPPORTEDTYPE); memblokir panggilan prosedur jarak jauh.

 

UUID objek dari panggilan adalah UUID objek yang ditemukan dalam pegangan pengikatan untuk prosedur panggilan jarak jauh.

Server mengatur jenis UUID objek dengan memanggil RpcObjectSetType untuk menentukan jenis UUID untuk objek.

Server mendaftarkan jenis untuk manajer EPV dengan memanggil RpcServerRegisterIf, RpcServerRegisterIfEx atau RpcServerRegisterIf2 menggunakan UUID jenis yang sama.

Nota

UUID objek null selalu secara otomatis diberikan tipe UUID null. Hal ini ilegal untuk menentukan UUID objek nihil dalam rutinitas RpcObjectSetType.

 

Mengirimkan Panggilan Prosedur Jarak Jauh ke Rutinitas Server-manager

Tabel berikut menunjukkan langkah-langkah yang diambil oleh perpustakaan run-time RPC untuk mendispatch panggilan prosedur jarak jauh ke rutin pengelola server.

Kasus sederhana di mana server mendaftarkan manajer default EPV, dijelaskan dalam tabel berikut.

Tabel Registri Antarmuka

Antarmuka UUID UUID jenis manajer Vektor titik masuk
uuid1 Kosong Default EPV

 

Tabel Registri Objek

UUID Objek Jenis objek
Kosong Kosong
(UUID objek lainnya) Nol

 

Memetakan Handel Pengikatan ke Vektor Titik Masuk (EPV)

Antarmuka UUID (dari handle pengikatan klien) UUID objek (dari pegangan pengikatan klien) Jenis objek (dari tabel registri objek) Manajer EPV (dari tabel registri antarmuka)
uuid1 Kosong Kosong Bawaan EPV
Sama seperti di atas uuidA Nol Default EPV

 

Langkah-langkah berikut menjelaskan tindakan yang diambil oleh pustaka runtime server RPC, seperti yang ditunjukkan dalam tabel sebelumnya, ketika seorang klien dengan antarmuka UUID uuid1 memanggilnya.

  1. Server memanggil RpcServerRegisterIf, RpcServerRegisterIfEx, atau RpcServerRegisterIf2 untuk mengaitkan antarmuka yang ditawarkannya dengan UUID jenis manajer nil dan dengan EPV manajer default yang dihasilkan MIDL. Panggilan ini menambahkan entri dalam tabel registri antarmuka. Antarmuka UUID terkandung dalam IfSpec parameter.

  2. Secara default, tabel registri objek mengaitkan semua UUID objek dengan UUID jenis nihil. Dalam contoh ini, server tidak memanggil RpcObjectSetType.

  3. Pustaka run-time server menerima kode prosedur jarak jauh yang berisi UUID antarmuka yang terkait dengan panggilan dan UUID objek dari handle pengikatan panggilan.

    Lihat entri referensi fungsi berikut untuk diskusi tentang bagaimana UUID objek diatur ke dalam handel pengikatan:

  4. Menggunakan antarmuka UUID dari panggilan prosedur jarak jauh, pustaka run-time server menemukan antarmuka UUID tersebut dalam tabel registri antarmuka.

    Jika server tidak mendaftarkan antarmuka menggunakan RpcServerRegisterIf, RpcServerRegisterIfEx, atau RpcServerRegisterIf2, maka panggilan prosedur jarak jauh kembali ke pemanggil dengan kode status RPC_S_UNKNOWN_IF.

  5. Menggunakan UUID objek dari handle pengikatan, pustaka run-time server menemukan UUID objek tersebut dalam tabel registri objek-objek. Dalam contoh ini, semua UUID objek memetakan ke tipe objek 'nil'.

  6. Pustaka run-time server menemukan jenis manajer nil dalam tabel registri antarmuka.

  7. Menggabungkan UUID antarmuka dan tipe null dalam tabel registri antarmuka akan ditetapkan ke EPV default, yang berisi rutinitas manajer server yang akan dijalankan untuk UUID antarmuka yang ditemukan dalam panggilan prosedur jarak jauh.

Asumsikan bahwa server menawarkan beberapa antarmuka dan beberapa implementasi setiap antarmuka, seperti yang dijelaskan dalam tabel berikut.

Tabel Registri Antarmuka

Antarmuka UUID UUID jenis manajer Vektor titik masuk
uuid1 Nol epv1
uuid1 uuid3 epv4
uuid2 uuid4 epv2
uuid2 uuid7 epv3

 

Tabel Registri Objek

UUID Objek Jenis objek
uuidA uuid3
uuidB uuid7
uuidC uuid7
uuidD uuid3
uuidE uuid3
uuidF uuid8
Nihil Nol
(Sebuah UUID lainnya) Nol

 

Memetakan Pegangan Pengikatan ke Vektor Titik Masuk

Antarmuka UUID (dari tangkai pengikatan klien) UUID objek (dari handle pengikatan klien) Jenis objek (dari tabel registri objek) Manajer EPV (dari tabel registri antarmuka)
uuid1 Tidak ada Kosong epv1
uuid1 uuidA uuid3 epv4
uuid1 uuidD uuid3 epv4
uuid1 uuidE uuid3 epv4
uuid2 uuidB uuid7 epv3
uuid2 uuidC uuid7 epv3

 

Langkah-langkah berikut menjelaskan tindakan yang dilakukan oleh pustaka run-time server, seperti yang ditunjukkan dalam tabel sebelumnya ketika klien dengan UUID antarmuka uuid2 dan UUID objek uuidC memanggilnya.

  1. Server memanggil RpcServerRegisterIf, RpcServerRegisterIfEx, atau RpcServerRegisterIf2 untuk mengaitkan antarmuka yang ditawarkannya dengan EPV manajer yang berbeda. Entri dalam tabel registri antarmuka mencerminkan empat panggilan RpcServerRegisterIf, RpcServerRegisterIfEx, atau RpcServerRegisterIf2 untuk menawarkan dua antarmuka, dengan dua implementasi (EPV) untuk setiap antarmuka.

  2. Server memanggilRpcObjectSetType untuk membuat jenis setiap objek yang ditawarkannya. Selain asosiasi bawaan objek kosong ke tipe kosong, semua UUID objek lainnya yang tidak secara eksplisit ditemukan dalam tabel registri objek juga dipetakan ke UUID tipe kosong.

    Dalam contoh ini, server memanggil rutinitas RpcObjectSetType enam kali.

  3. Perpustakaan run-time server menerima panggilan prosedur jarak jauh yang berisi UUID antarmuka yang dimiliki panggilan tersebut dan UUID objek dari handle pengikatan panggilan.

  4. Menggunakan antarmuka UUID dari panggilan prosedur jarak jauh, pustaka run-time server menemukan antarmuka UUID dalam tabel registri antarmuka.

  5. Menggunakan UUID objek uuidC pada handle pengikatan, pustaka waktu run server menemukan UUID objek dalam tabel registri objek dan menemukan bahwa ia dipetakan ke tipe uuid7.

  6. Untuk menentukan tipe manajer, pustaka run-time server menggabungkan UUID antarmuka, uuid2, dan tipe uuid7 dalam tabel registri antarmuka. Ini ditetapkan sebagai epv3, yang berisi rutinitas manajer server yang akan dijalankan untuk panggilan prosedur jarak jauh.

Rutinitas dalam epv2 tidak akan pernah dijalankan karena server belum memanggil RpcObjectSetType rutin untuk menambahkan objek apa pun dengan UUID jenis uuid4 ke tabel registri objek.

Panggilan prosedur jarak jauh dengan antarmuka UUID uuid2 dan UUID objek uuidF kembali ke pemanggil dengan kode status RPC_S_UNKNOWN_MGR_TYPE karena server tidak memanggil RpcServerRegisterIf, RpcServerRegisterIfEx, atau RpcServerRegisterIf2 untuk mendaftarkan antarmuka dengan tipe manajer uuid8.

Mengembalikan Nilai

Fungsi ini mengembalikan salah satu nilai berikut.

Nilai Arti
RPC_S_OK Keberhasilan
Tipe RPC sudah terdaftar Ketik UUID yang sudah terdaftar

 

Menyediakan fungsi penyelidikan objek Anda sendiri

Pertimbangkan server yang mengelola ribuan objek dari berbagai jenis. Setiap kali server dimulai, aplikasi server harus memanggil fungsi RpcObjectSetType untuk setiap objek, meskipun klien mungkin hanya merujuk ke beberapa dari mereka (atau membutuhkan waktu lama untuk merujuknya). Ribuan objek ini kemungkinan berada di disk, jadi mengambil jenisnya akan memakan waktu. Selain itu, tabel internal yang memetakan UUID objek ke UUID jenis manajer pada dasarnya akan menduplikasi pemetaan yang dipertahankan dengan objek itu sendiri.

Untuk kenyamanan, set fungsi RPC mencakup fungsi RpcObjectSetInqFn. Dengan fungsi ini, Anda menyediakan fungsi penyelidikan objek Anda sendiri.

Sebagai contoh, Anda dapat menyediakan fungsi penyelidikan objek Anda sendiri ketika Anda memetakan objek 100–199 ke tipe nomor 1, 200–299 ke tipe nomor 2, dan sebagainya. Fungsi pertanyaan objek juga dapat diperluas ke sistem file terdistribusi, di mana aplikasi server tidak memiliki daftar semua file (UUID objek) yang tersedia, atau ketika UUID objek memberi nama file dalam sistem file dan Anda tidak ingin memuat semua pemetaan antara UUID objek dan UUID jenis.

RpcBindingFromStringBinding

RpcBindingSetObject

RpcNsBindingExport

RpcNsBindingImportBegin

RpcNsBindingLookupBegin

RpcObjectSetType

RpcServerRegisterIf

RpcServerRegisterIf2

RpcServerRegisterIfEx

RpcServerUnregisterIf

RpcServerUnregisterIfEx