Bagikan melalui


Metode IMoniker::ComposeWith (objidl.h)

Membuat moniker komposit baru dengan menggabungkan moniker saat ini dengan moniker yang ditentukan.

Sintaks

HRESULT ComposeWith(
  [in]  IMoniker *pmkRight,
  [in]  BOOL     fOnlyIfNotGeneric,
  [out] IMoniker **ppmkComposite
);

Parameter

[in] pmkRight

Penunjuk ke antarmuka IMoniker pada moniker untuk menyusun ke akhir moniker ini.

[in] fOnlyIfNotGeneric

Jika TRUE, pemanggil memerlukan komposisi nongenerik, sehingga operasi harus dilanjutkan hanya jika pmkRight adalah kelas moniker yang dapat disusupi moniker ini dengan cara tertentu selain membentuk komposit generik. Jika FALSE, metode dapat membuat komposit generik jika perlu. Sebagian besar penelepon harus mengatur parameter ini ke FALSE.

[out] ppmkComposite

Penunjuk ke variabel penunjuk IMoniker yang menerima pointer moniker komposit. Ketika berhasil, implementasi harus memanggil AddRef pada moniker yang dihasilkan; adalah tanggung jawab penelepon untuk memanggil Rilis. Jika terjadi kesalahan atau jika moniker tidak membuat apa-apa (misalnya, menyusun anti-moniker dengan moniker item atau moniker file), *ppmkComposite harus diatur ke NULL.

Nilai kembali

Metode ini dapat mengembalikan nilai pengembalian standar E_OUTOFMEMORY dan E_UNEXPECTED, serta nilai berikut.

Menampilkan kode Deskripsi
S_OK
Moniker berhasil digabungkan.
MK_E_NEEDGENERIC
Menunjukkan bahwa fOnlyIfNotGenericTRUE, tetapi moniker tidak dapat disusun bersama tanpa membuat moniker komposit generik.

Keterangan

Menggabungkan dua moniker bersama-sama disebut komposisi. Terkadang dua moniker dari kelas yang sama dapat digabungkan dalam apa yang disebut komposisi nongenerik. Misalnya, moniker file yang mewakili jalur yang tidak lengkap dan moniker file lain yang mewakili jalur relatif dapat digabungkan untuk membentuk moniker file tunggal yang mewakili jalur lengkap. Komposisi nongenerik untuk kelas moniker tertentu hanya dapat ditangani dalam implementasi ComposeWith untuk kelas moniker tersebut.

Menggabungkan dua moniker dari kelas apa pun disebut komposisi generik, yang dapat dicapai melalui panggilan ke fungsi CreateGenericComposite .

Komposisi monikers adalah operasi asosiatif. Artinya, jika A, B, dan C adalah moniker, maka, di mana Comp() mewakili operasi komposisi, Comp( Comp( A, B ), C )

selalu sama dengan Comp( A, Comp( B, C ) ).

Catatan untuk Penelepon

Untuk menggabungkan dua moniker, Anda harus memanggil ComposeWith daripada memanggil fungsi CreateGenericComposite untuk memberi moniker pertama kesempatan untuk melakukan komposisi nongenerik.

Objek yang menyediakan moniker item untuk mengidentifikasi objeknya akan memanggil ComposeWith untuk menyediakan moniker yang sepenuhnya mengidentifikasi lokasi objek. Ini akan berlaku, misalnya, ke server yang mendukung penautan ke bagian dokumen, atau ke kontainer yang mendukung penautan ke objek yang disematkan dalam dokumennya. Dalam situasi seperti itu, Anda akan melakukan hal berikut:

  1. Buat moniker item yang mengidentifikasi objek .
  2. Dapatkan moniker yang mengidentifikasi kontainer objek.
  3. Panggil ComposeWith pada moniker yang mengidentifikasi kontainer, meneruskan moniker item sebagai parameter pmkRight .

Catatan untuk Pelaksana

Anda dapat menggunakan komposisi nongenerik atau generik untuk menyusun moniker saat ini dengan moniker yang ditunjuk pmkRight. Jika kelas moniker yang ditunjukkan oleh pmkRight sama dengan moniker saat ini, dimungkinkan untuk menggunakan konten pmkRight untuk melakukan komposisi nongenerik yang lebih cerdas.

Dalam menulis kelas moniker baru, Anda harus memutuskan apakah ada jenis moniker, apakah kelas Anda sendiri atau kelas lain, yang ingin Anda berikan perlakuan khusus. Jika demikian, terapkan ComposeWith untuk memeriksa apakah pmkRight adalah moniker dari jenis yang harus memiliki perawatan ini. Untuk melakukan ini, Anda dapat memanggil metode IPersist::GetClassID moniker, atau jika Anda telah menentukan objek moniker yang mendukung antarmuka kustom, Anda dapat memanggil QueryInterface di moniker untuk antarmuka tersebut. Contoh perlakuan khusus adalah komposisi nongenerik dari moniker file absolut dengan moniker file relatif. Kasus paling umum dari moniker khusus adalah inversi untuk kelas moniker Anda (apa pun yang Anda kembalikan dari implementasi IMoniker::Inverse).

Jika pmkRight sepenuhnya meniadakan penerima sehingga komposit yang dihasilkan kosong, Anda harus meneruskan kembali NULL di ppmkComposite dan mengembalikan kode status S_OK.

Jika parameter pmkRight bukan kelas yang Anda berikan perlakuan khusus, periksa fOnlyIfNotGeneric untuk menentukan apa yang harus dilakukan selanjutnya. Jika fOnlyIfNotGenericTRUE, berikan kembali NULL melalui ppmkComposite dan kembalikan kode status MK_E_NEEDGENERIC. Jika fOnlyIfNotGenericfalse, panggil fungsi CreateGenericComposite untuk melakukan komposisi secara umum.

Catatan khusus implementasi

Implementasi Catatan
Anti-moniker Jika fOnlyIfNotGenericTRUE, metode ini mengatur ppmkComposite ke moniker NULL dan mengembalikan MK_E_NEEDGENERIC; jika tidak, metode mengembalikan hasil menggabungkan dua moniker ke dalam komposit generik. Perhatikan bahwa menyusun file, item, atau penunjuk moniker di sebelah kanan anti-moniker menghasilkan komposit generik daripada menyusun ke apa-apa, seperti halnya jika urutan komposisi dibalik.
Moniker kelas Mengikuti kontrak dan berkinerja seperti moniker item karena dapat mengembalikan E_INVALIDARG dan MK_E_NEEDGENERIC, dan sebagainya.
Moniker file Jika pmkRight adalah anti-moniker, moniker yang dikembalikan adalah NULL. Jika pmkRight adalah komposit yang komponen paling kirinya adalah anti-moniker, moniker yang dikembalikan adalah komposit dengan anti-moniker paling kiri dihapus. Jika pmkRight adalah moniker file, metode ini menciutkan kedua moniker menjadi satu file moniker, jika memungkinkan. Jika tidak memungkinkan (misalnya, jika kedua moniker file mewakili jalur absolut, seperti dalam d:\work dan e:\reports), moniker yang dikembalikan adalah NULL dan nilai yang dikembalikan MK_E_SYNTAX. Jika pmkRight bukan anti-moniker atau moniker file, metode memeriksa parameter fOnlyIfNotGeneric ; jika FALSE, metode menggabungkan dua moniker ke dalam komposit generik; jika TRUE, metode menetapkan *ppmkComposite ke NULL dan mengembalikan MK_E_NEEDGENERIC.
Moniker komposit generik Jika fOnlyIfNotGenericTRUE, metode ini mengatur *pmkComposite ke NULL dan mengembalikan MK_E_NEEDGENERIC; jika tidak, metode mengembalikan hasil menggabungkan dua moniker dengan memanggil fungsi CreateGenericComposite .
Moniker item Jika pmkRight adalah anti-moniker, moniker yang dikembalikan adalah NULL. Jika pmkRight adalah komposit yang komponen paling kirinya adalah anti-moniker, moniker yang dikembalikan adalah komposit setelah anti-moniker paling kiri dihapus. Jika pmkRight bukan anti-moniker, metode menggabungkan kedua moniker ke dalam komposit generik jika fOnlyIfNotGenericFALSE; jika fOnlyIfNotGenericadalah TRUE, metode mengembalikan moniker NULL dan nilai pengembalian MK_E_NEEDGENERIC.
Moniker OBJREF Jika pmkRight adalah anti-moniker, moniker yang dikembalikan adalah NULL. Jika pmkRight adalah komposit yang komponen paling kirinya adalah anti-moniker, moniker yang dikembalikan adalah komposit dengan anti-moniker paling kiri dihapus. Jika pmkRight bukan anti-moniker atau moniker komposit yang komponen paling kirinya adalah anti-moniker, metode memeriksa parameter fOnlyIfNotGeneric . Jika FALSE, metode menggabungkan kedua moniker ke dalam komposit generik; jika TRUE, metode menetapkan *ppmkComposite ke NULL dan mengembalikan MK_E_NEEDGENERIC.
Penunjuk moniker Jika pmkRight adalah anti-moniker, moniker yang dikembalikan adalah NULL. Jika pmkRight adalah komposit yang komponen paling kirinya adalah anti-moniker, moniker yang dikembalikan adalah komposit setelah anti-moniker paling kiri dihapus. Jika fOnlyIfNotGenericADALAH FALSE, moniker yang dikembalikan adalah komposit generik dari dua moniker; jika tidak, metode mengatur *ppmkComposite ke NULL dan mengembalikan MK_E_NEEDGENERIC.
Moniker URL Moniker URL mendukung komposisi dua URL: URL dasar yang terdiri dari URL relatif. Komposisi ini dilakukan sesuai dengan RFC pada URL relatif. Jika fOnlyIfNotGenericTRUE, metode mengembalikan MK_E_NEEDGENERIC. Jika tidak, metode ini hanya mengembalikan CreateGenericComposite (ini, pmkRight, ppmkComposite).

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows 2000 Professional [hanya aplikasi desktop]
Server minimum yang didukung Windows 2000 Server [hanya aplikasi desktop]
Target Platform Windows
Header objidl.h

Lihat juga

CreateGenericComposite

IMoniker