Bagikan melalui


Metode IMessageFilter::MessagePending (objidl.h)

Menunjukkan bahwa pesan telah tiba saat COM sedang menunggu untuk merespons panggilan jarak jauh.

Menangani input sambil menunggu panggilan keluar selesai dapat menimbulkan komplikasi. Aplikasi harus menentukan apakah akan memproses pesan tanpa mengganggu panggilan, untuk terus menunggu, atau membatalkan operasi.

Sintaks

DWORD MessagePending(
  [in] HTASK htaskCallee,
  [in] DWORD dwTickCount,
  [in] DWORD dwPendingType
);

Parameter

[in] htaskCallee

Id utas dari aplikasi yang disebut.

[in] dwTickCount

Jumlah tanda centang sejak panggilan dilakukan. Ini dihitung dari fungsi GetTickCount .

[in] dwPendingType

Jenis panggilan yang dilakukan di mana pesan atau peristiwa diterima. Nilai yang mungkin berasal dari enumerasi PENDINGTYPE, di mana PENDINGTYPE_TOPLEVEL berarti panggilan keluar tidak ditumpuk dalam panggilan dari aplikasi lain dan PENDINTGYPE_NESTED berarti panggilan keluar ditumpuk dalam panggilan dari aplikasi lain.

Nilai kembali

Metode ini dapat mengembalikan nilai berikut.

Menampilkan kode Deskripsi
PENDINGMSG_CANCELCALL
Batalkan panggilan keluar. Ini harus dikembalikan hanya dalam kondisi ekstrem. Membatalkan panggilan yang belum membalas atau ditolak dapat membuat transaksi yatim piatu dan kehilangan sumber daya. COM gagal dalam panggilan asli dan mengembalikan RPC_E_CALL_CANCELLED.
PENDINGMSG_WAITNOPROCESS
Tidak digunakan.
PENDINGMSG_WAITDEFPROCESS
Pesan keyboard dan mouse tidak lagi dikirim. Namun ada beberapa kasus di mana pesan mouse dan keyboard dapat menyebabkan sistem mengalami kebuntuan, dan dalam kasus ini, pesan mouse dan keyboard dibuang. WM_PAINT pesan dikirim. Pesan pengalihan tugas dan aktivasi ditangani seperti sebelumnya.

Keterangan

COM memanggil MessagePending setelah aplikasi melakukan panggilan metode COM dan pesan Windows terjadi sebelum panggilan kembali. Pesan Windows dikirim, misalnya, saat pengguna memilih perintah menu atau mengklik dua kali objek. Sebelum COM melakukan panggilan MessagePending , ia menghitung waktu yang berlalu sejak panggilan metode COM asli dilakukan. COM memberikan waktu yang berlalu dalam parameter dwTickCount . Sementara itu, COM tidak menghapus pesan dari antrean.

Pesan Windows yang muncul dalam antrean pemanggil harus tetap dalam antrean sampai waktu yang cukup berlalu untuk memastikan bahwa pesan mungkin bukan hasil mengetik di depan, tetapi sebagai gantinya merupakan upaya untuk mendapatkan perhatian. Atur penundaan dengan parameter dwTickCount —penundaan dua detik atau tiga detik disarankan. Jika jumlah waktu berlalu dan panggilan belum selesai, pemanggil harus menghapus pesan dari antrean dan kotak dialog sibuk OLE UI harus ditampilkan menawarkan pengguna pilihan mencoba kembali panggilan (lanjutkan menunggu) atau beralih ke tugas yang ditentukan. Ini memastikan perilaku berikut:

  • Jika panggilan selesai dalam waktu yang wajar, jenis di depan akan diperlakukan dengan benar.
  • Jika penerima panggilan tidak merespons, ketik depan tidak disalahartikan dan pengguna dapat bertindak untuk menyelesaikan masalah. Misalnya, server OLE 1 dapat mengantre permintaan tanpa merespons saat berada dalam kotak dialog modal.
Menangani input sambil menunggu panggilan keluar selesai dapat menimbulkan komplikasi. Aplikasi harus menentukan apakah akan memproses pesan tanpa mengganggu panggilan, untuk terus menunggu, atau membatalkan operasi.

Ketika tidak ada respons terhadap panggilan COM asli, aplikasi dapat membatalkan panggilan dan memulihkan objek COM ke status konsisten dengan memanggil IStorage::Kembalikan pada penyimpanannya. Objek dapat dilepaskan ketika kontainer dapat dimatikan. Namun, membatalkan panggilan dapat membuat operasi tanpa sumber daya dan kebocoran sumber daya. Pembatalan hanya boleh digunakan sebagai upaya terakhir. Sangat disarankan agar aplikasi tidak mengizinkan panggilan tersebut dibatalkan.

Catatan Meskipun parameter htaskCallee diketik sebagai HTASK, parameter tersebut berisi id utas dari utas yang disebut. Saat Anda menerapkan antarmuka IMessageFilter , Anda dapat memanggil fungsi OpenThread untuk mendapatkan handel utas dari parameter htaskCallee , dan Anda dapat memanggil fungsi GetProcessIdOfThread untuk mendapatkan id proses.
 

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

IMessageFilter

OleUIBusy