Bagikan melalui


Fungsi CoDisconnectContext (combaseapi.h)

Memutuskan semua koneksi proksi yang sedang dipertahankan atas nama semua penunjuk antarmuka yang menunjuk ke objek dalam konteks saat ini.

Fungsi ini memblokir koneksi hingga semua objek berhasil terputus atau waktu habis kedaluwarsa. Hanya konteks yang benar-benar mengelola objek yang harus memanggil CoDisconnectContext.

Sintaks

HRESULT CoDisconnectContext(
  [in] DWORD dwTimeout
);

Parameter

[in] dwTimeout

Waktu dalam milidetik setelah CoDisconnectContext kembali meskipun koneksi proksi untuk semua objek belum terputus. INFINITE adalah nilai yang dapat diterima untuk parameter ini.

Nilai kembali

Fungsi ini dapat mengembalikan nilai pengembalian standar E_FAIL, E_INVALIDARG, dan E_OUTOFMEMORY, serta nilai berikut.

Menampilkan kode Deskripsi
S_OK
Sambungan proksi untuk semua objek berhasil diputus.
RPC_E_TIMEOUT
Tidak semua koneksi proksi berhasil dihapus dalam waktu yang ditentukan dalam dwTimeout.
CO_E_NOTSUPPORTED
Konteks saat ini tidak dapat diputus sambungannya.
CONTEXT_E_WOULD_DEADLOCK
Objek mencoba memanggil CoDisconnectContext pada konteks tempat objek berada. Ini akan menyebabkan fungsi kehabisan waktu dan kebuntuan jika dwTimeout diatur ke INFINITE.

Keterangan

Fungsi CoDisconnectContext digunakan untuk mendukung pembongkaran layanan di host layanan bersama tempat Anda harus membongkar biner layanan Anda tanpa memengaruhi server COM lain yang berjalan dalam proses yang sama. Jika Anda mengontrol masa pakai proses dan Anda tidak membongkar sampai proses keluar, infrastruktur COM akan melakukan pembersihan yang diperlukan secara otomatis dan Anda tidak perlu memanggil fungsi ini.

Fungsi CoDisconnectContext memungkinkan server untuk memutuskan semua klien eksternal dari semua objek dengan benar dalam konteks saat ini. Konteks default tidak dapat terputus. Untuk menggunakan CoDisconnectContext, Anda harus terlebih dahulu membuat konteks yang dapat diputus dan mendaftarkan pabrik kelas Anda untuk objek yang ingin Anda putuskan sambungannya dalam konteks tersebut. Anda dapat melakukan ini dengan antarmuka IContextCallback .

Jika CoDisconnectContext mengembalikan RPC_E_TIMEOUT, ini tidak menunjukkan bahwa fungsi tidak memutuskan sambungan objek, tetapi tidak semua pemutusan dapat diselesaikan dalam waktu yang ditentukan oleh dwTimeout karena panggilan yang luar biasa pada objek. Semua objek akan terputus setelah semua panggilan di atasnya selesai.

Tidak aman untuk membongkar DLL yang menghosting layanan sampai CoDisconnectContext mengembalikan S_OK. Jika fungsi mengembalikan RPC_E_TIMEOUT, layanan dapat melakukan pembersihan lainnya. Layanan harus memanggil fungsi sampai kembali S_OK, dan kemudian dapat dengan aman membongkar DLL-nya.

Fungsi CoDisconnectContext melakukan tugas-tugas berikut:

  • Memanggil CoDisconnectObject pada semua objek dalam konteks saat ini.
  • Memblokir hingga semua objek terputus atau waktu habis telah kedaluwarsa.
Fungsi CoDisconnectContext memiliki batasan berikut:
  • Panggilan COM asinkron tidak didukung.
  • Objek dalam proses harus didaftarkan dan diaktifkan menggunakan bendera CLSCTX_LOCAL_SERVER, atau tidak akan terputus.
  • COM+ tidak didukung.
  • Penunjuk antarmuka COM peka konteks. Oleh karena itu, setiap penunjuk antarmuka yang dibuat dalam konteks yang akan terputus hanya dapat digunakan dalam konteks tersebut.

Contoh

IContextCallback *icc;
hr = CoCreateInstance(CLSID_ContextSwitcher, NULL, CLSCTX_INPROC_SERVER, IID_IContextCallback, (void**)&icc);

icc->ContextCallback(EnterCallback, NULL, IID_IContextCallback, 5, NULL);

HRESULT __stdcall EnterCallback(ComCallData *pv)
{ 
    return CoRegisterClassObject(...);
}

/* All objects created by the class factories registered in the callback will be put into the newly created context.
To disconnect, re-enter the context, revoke the class factories, and call CoDisconnectContext. */

icc->ContextCallback(DisconnectCallback, NULL, IID_IContextCallback, 5, NULL);

HRESULT __stdcall DisconnectCallback(ComCallData *pv)
{
    CoRevokeClassObject(...);
    return CoDisconnectContext(timeout);
}


Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows Vista [hanya aplikasi desktop]
Server minimum yang didukung Windows Server 2008 [hanya aplikasi desktop]
Target Platform Windows
Header combaseapi.h (termasuk Objbase.h)
Pustaka Ole32.lib
DLL Ole32.dll

Lihat juga

CoDisconnectObject

IContextCallback