Manajemen Transaksi (Pertukaran Data)

Setelah membuat percakapan dengan server, klien dapat mengirim transaksi untuk mendapatkan data dan layanan dari server.

Topik berikut menjelaskan jenis transaksi yang dapat digunakan klien untuk berinteraksi dengan server.

Transaksi Permintaan

Aplikasi klien dapat menggunakan transaksi XTYP_REQUEST untuk meminta item data dari aplikasi server. Klien memanggil fungsi DdeClientTransaction, menentukan XTYP_REQUEST sebagai jenis transaksi dan menentukan item data yang dibutuhkan aplikasi.

Dynamic Data Exchange Management Library (DDEML) meneruskan transaksi XTYP_REQUEST ke server, menentukan nama topik, nama item, dan format data yang diminta oleh klien. Jika server mendukung topik, item, dan format yang diminta, server harus mengembalikan handel data yang mengidentifikasi nilai item saat ini. DDEML meneruskan handel ini ke klien sebagai nilai pengembalian dari DdeClientTransaction. Server harus mengembalikan NULL jika tidak mendukung topik, item, atau format yang diminta.

DdeClientTransaction menggunakan parameter lpdwResult untuk mengembalikan bendera status transaksi ke klien. Jika server tidak memproses transaksi XTYP_REQUEST, DdeClientTransaction mengembalikan NULL, dan lpdwResult menunjuk ke bendera DDE_FNOTPROCESSED atau DDE_FBUSY. Jika bendera DDE_FNOTPROCESSED dikembalikan, klien tidak dapat menentukan mengapa server tidak memproses transaksi.

Jika server tidak mendukung transaksi XTYP_REQUEST, server harus menentukan bendera filter CBF_FAIL_REQUESTS dalam fungsi DdeInitialize. Bendera ini mencegah DDEML mengirim transaksi ke server.

Transaksi Poke

Klien dapat mengirim data yang tidak diminta ke server dengan menggunakan DdeClientTransaction untuk mengirim transaksi XTYP_POKE ke fungsi panggilan balik server.

Aplikasi klien pertama-tama membuat buffer yang berisi data untuk dikirim ke server dan kemudian meneruskan pointer ke buffer sebagai parameter ke DdeClientTransaction. Atau, klien dapat menggunakan fungsi DdeCreateDataHandle untuk mendapatkan handel data yang mengidentifikasi data dan kemudian meneruskan handel ke DdeClientTransaction. Dalam kedua kasus, klien juga menentukan nama topik, nama item, dan format data saat memanggil DdeClientTransaction.

DDEML meneruskan transaksi XTYP_POKE ke server, menentukan nama topik, nama item, dan format data yang diminta klien. Untuk menerima item dan format data, server harus mengembalikan DDE_FACK. Untuk menolak data, server harus mengembalikan DDE_FNOTPROCESSED. Jika server terlalu sibuk untuk menerima data, server harus mengembalikan DDE_FBUSY.

Ketika DdeClientTransaction kembali, klien dapat menggunakan parameter lpdwResult untuk mengakses bendera status transaksi. Jika bendera DDE_FBUSY, klien harus mengirim transaksi lagi nanti.

Jika server tidak mendukung transaksi XTYP_POKE, server harus menentukan bendera filter CBF_FAIL_POKES di DdeInitialize. Bendera ini mencegah DDEML mengirim transaksi ini ke server.

Sarankan Transaksi

Aplikasi klien dapat menggunakan DDEML untuk membuat satu atau beberapa tautan ke item dalam aplikasi server. Ketika tautan seperti itu telah dibuat, server mengirim pembaruan berkala tentang item tertaut ke klien (biasanya, setiap kali nilai item yang terkait dengan aplikasi server berubah). Penautan menetapkan perulangan saran antara dua aplikasi yang tetap ada sampai klien mengakhirinya.

Ada dua jenis perulangan saran: "panas" dan "hangat." Dalam perulangan hot advise, server segera mengirim handel data yang mengidentifikasi nilai yang diubah. Dalam perulangan saran hangat, server memberi tahu klien bahwa nilai item telah berubah tetapi tidak mengirim handel data sampai klien memintanya.

Klien dapat meminta perulangan hot advise dengan server dengan menentukan jenis transaksi XTYP_ADVSTART dalam panggilan ke DdeClientTransaction. Untuk meminta perulangan saran hangat, klien harus menggabungkan bendera XTYPF_NODATA dengan jenis transaksi XTYP_ADVSTART . Dalam salah satu peristiwa, DDEML meneruskan transaksi XTYP_ADVSTART ke fungsi panggilan balik Dynamic Data Exchange (DDE) server. Fungsi panggilan balik DDE server harus memeriksa parameter yang menyertai transaksi XTYP_ADVSTART (termasuk format yang diminta, nama topik, dan nama item) lalu mengembalikan TRUE untuk memungkinkan perulangan saran atau FALSE untuk menolaknya.

Setelah perulangan saran dibuat, aplikasi server harus memanggil fungsi DdePostAdvise setiap kali nilai item yang terkait dengan nama item yang diminta berubah. Panggilan ini menghasilkan transaksi XTYP_ADVREQ dikirim ke fungsi panggilan balik DDE server sendiri. Fungsi panggilan balik DDE server harus mengembalikan handel data yang mengidentifikasi nilai baru item data. DDEML kemudian memberi tahu klien bahwa item yang ditentukan telah berubah dengan mengirim transaksi XTYP_ADVDATA ke fungsi panggilan balik DDE klien.

Jika klien meminta perulangan hot advise, DDEML meneruskan handel data ke item yang diubah ke klien selama transaksi XTYP_ADVDATA. Jika tidak, klien dapat mengirim transaksi XTYP_REQUEST untuk mendapatkan handel data.

Dimungkinkan bagi server untuk mengirim pembaruan lebih cepat daripada klien dapat memproses data baru. Kecepatan pembaruan dapat menjadi masalah bagi klien yang harus melakukan operasi pemrosesan yang panjang pada data. Dalam hal ini, klien harus menentukan bendera XTYPF_ACKREQ saat meminta perulangan saran. Bendera ini menyebabkan server menunggu klien mengakui bahwa ia telah menerima dan memproses item data sebelum server mengirim item data berikutnya. Sarankan perulangan yang dibuat dengan bendera XTYPF_ACKREQ lebih kuat dengan server cepat tetapi terkadang dapat melewatkan pembaruan. Menyarankan perulangan yang dibuat tanpa bendera XTYPF_ACKREQ dijamin tidak akan melewatkan pembaruan selama klien mengikuti server.

Klien dapat mengakhiri perulangan saran dengan menentukan jenis transaksi XTYP_ADVSTOP dalam panggilan ke DdeClientTransaction.

Jika server tidak mendukung perulangan saran, server harus menentukan bendera filter CBF_FAIL_ADVISES dalam fungsi DdeInitialize. Bendera ini mencegah DDEML mengirim transaksi XTYP_ADVSTART dan XTYP_ADVSTOP ke server.

Jalankan Transaksi

Klien dapat menggunakan transaksi XTYP_EXECUTE untuk menyebabkan server menjalankan perintah atau serangkaian perintah.

Untuk menjalankan perintah server, klien terlebih dahulu membuat buffer yang berisi string perintah untuk dijalankan server lalu meneruskan penunjuk ke buffer atau handel data yang mengidentifikasi buffer saat memanggil DdeClientTransaction. Parameter lain yang diperlukan termasuk handel percakapan, handel string nama item, spesifikasi format, dan jenis transaksi XTYP_EXECUTE . Aplikasi yang membuat handel data untuk meneruskan data eksekusi harus menentukan NULL untuk parameter hszItem dari fungsi DdeCreateDataHandle dan nol untuk parameter uFmt.

DDEML meneruskan transaksi XTYP_EXECUTE ke fungsi panggilan balik DDE server dan menentukan nama format, handel percakapan, nama topik, dan penanganan data yang mengidentifikasi string perintah. Jika server mendukung perintah, server harus menggunakan fungsi DdeAccessData untuk mendapatkan penunjuk ke string perintah, menjalankan perintah, lalu mengembalikan DDE_FACK. Jika server tidak mendukung perintah atau tidak dapat menyelesaikan transaksi, server harus mengembalikan DDE_FNOTPROCESSED. Server harus mengembalikan DDE_FBUSY jika terlalu sibuk untuk menyelesaikan transaksi.

Secara umum, fungsi panggilan balik server harus memproses transaksi XTYP_EXECUTE sebelum kembali dengan pengecualian berikut:

  1. Ketika perintah diteruskan dengan transaksi XTYP_EXECUTE meminta server untuk dihentikan, server tidak boleh dihentikan sampai fungsi panggilan baliknya kembali dari pemrosesan XTYP_EXECUTE.
  2. Jika server harus melakukan operasi, seperti memproses kotak dialog atau transaksi DDE yang dapat menyebabkan masalah rekursi DDEML, server harus mengembalikan kode pengembalian CBR_BLOCK untuk memblokir transaksi eksekusi, melakukan operasi, lalu melanjutkan pemrosesan transaksi eksekusi.

Ketika DdeClientTransaction kembali, klien dapat menggunakan parameter lpdwResult untuk mengakses bendera status transaksi. Jika bendera DDE_FBUSY, klien harus mengirim transaksi lagi nanti.

Jika server tidak mendukung transaksi XTYP_EXECUTE, server harus menentukan bendera filter CBF_FAIL_EXECUTES dalam fungsi DdeInitialize. Melakukannya mencegah DDEML mengirim transaksi ke server.

Transaksi Sinkron dan Asinkron

Klien dapat mengirim transaksi sinkron atau asinkron. Dalam transaksi sinkron, klien menentukan nilai waktu habis yang menunjukkan jumlah waktu maksimum yang akan menunggu server memproses transaksi. DdeClientTransaction tidak kembali sampai server memproses transaksi, transaksi gagal, atau nilai waktu habis kedaluwarsa. Klien menentukan nilai waktu habis saat memanggil DdeClientTransaction.

Selama transaksi sinkron, klien memasukkan perulangan modal sambil menunggu transaksi diproses. Klien masih dapat memproses input pengguna tetapi tidak dapat mengirim transaksi sinkron lain sampai DdeClientTransaction kembali.

Klien mengirim transaksi asinkron dengan menentukan bendera TIMEOUT_ASYNC di DdeClientTransaction. Fungsi kembali setelah transaksi dimulai, meneruskan pengidentifikasi transaksi ke klien. Ketika server selesai memproses transaksi asinkron, DDEML mengirimkan transaksi XTYP_XACT_COMPLETE ke klien. Salah satu parameter yang diteruskan DDEML ke klien selama transaksi XTYP_XACT_COMPLETE adalah pengidentifikasi transaksi. Dengan membandingkan pengidentifikasi transaksi ini dengan pengidentifikasi yang dikembalikan oleh DdeClientTransaction, klien mengidentifikasi transaksi asinkron mana yang telah selesai diproses server.

Klien dapat menggunakan fungsi DdeSetUserHandle sebagai bantuan dalam memproses transaksi asinkron. Fungsi ini memungkinkan klien untuk mengaitkan nilai yang ditentukan aplikasi dengan handel percakapan dan pengidentifikasi transaksi. Klien dapat menggunakan fungsi DdeQueryConvInfo selama transaksi XTYP_XACT_COMPLETE untuk mendapatkan nilai yang ditentukan aplikasi. Karena fungsi ini, aplikasi tidak perlu mempertahankan daftar pengidentifikasi transaksi aktif.

Ketika klien berhasil menyelesaikan permintaan data menggunakan transaksi sinkron, DDEML tidak memiliki cara untuk mengetahui kapan klien telah selesai menggunakan data yang diterima. Aplikasi klien harus meneruskan handel data yang diterima ke fungsi DdeFreeDataHandle , memberi tahu DDEML bahwa handel tidak akan lagi digunakan. Handel data yang dikembalikan oleh transaksi sinkron secara efektif dimiliki oleh klien.

Jika server tidak memproses transaksi asinkron tepat waktu, klien dapat meninggalkan transaksi dengan memanggil fungsi DdeAbandonTransaction. DDEML merilis semua sumber daya yang terkait dengan transaksi dan membuang hasil transaksi ketika server selesai memprosesnya. Waktu habis selama transaksi sinkron secara efektif membatalkan transaksi.

Metode transaksi asinkron disediakan untuk aplikasi yang harus mengirim transaksi DDE dalam volume tinggi sekaligus melakukan pemrosesan dalam jumlah besar secara bersamaan, seperti melakukan penghitungan. Metode asinkron juga berguna dalam aplikasi yang harus berhenti memproses transaksi DDE untuk sementara sehingga mereka dapat menyelesaikan tugas lain tanpa gangguan. Dalam sebagian besar situasi lain, aplikasi harus menggunakan metode sinkron.

Transaksi sinkron lebih mudah dipertahankan dan lebih cepat daripada transaksi asinkron. Namun, hanya satu transaksi sinkron yang dapat dilakukan pada satu waktu, sedangkan banyak transaksi asinkron yang dapat dilakukan secara bersamaan. Dengan transaksi sinkron, server lambat dapat menyebabkan klien tetap menganggur saat menunggu respons. Selain itu, transaksi sinkron menyebabkan klien memasukkan perulangan modal yang dapat melewati pemfilteran pesan dalam perulangan pesan aplikasi sendiri.

Jika klien telah menginstal prosedur kait untuk memfilter pesan (yaitu, menentukan jenis kait WH_MSGFILTER dalam panggilan ke fungsi SetWindowsHookEx ), transaksi sinkron tidak akan menyebabkan sistem melewati prosedur kait. Ketika peristiwa input terjadi saat klien menunggu transaksi sinkron berakhir, prosedur kait menerima kode kait MSGF_DDEMGR. Bahaya utama menggunakan perulangan modal transaksi sinkron adalah bahwa perulangan modal yang dibuat oleh kotak dialog dapat mengganggu operasinya. Transaksi asinkron harus selalu digunakan ketika DDEML digunakan oleh DLL.

Kontrol Transaksi

Aplikasi dapat menangguhkan transaksi ke fungsi panggilan balik DDE-nya baik transaksi yang terkait dengan handel percakapan tertentu atau semua transaksi terlepas dari handel percakapan. Kemampuan ini berguna ketika aplikasi menerima transaksi yang memerlukan pemrosesan yang panjang. Dalam kasus seperti itu, aplikasi dapat mengembalikan kode pengembalian CBR_BLOCK untuk menangguhkan transaksi di masa mendatang yang terkait dengan handel percakapan transaksi, sehingga aplikasi bebas memproses percakapan lain.

Ketika pemrosesan telah selesai, aplikasi memanggil fungsi DdeEnableCallback untuk melanjutkan transaksi yang terkait dengan percakapan yang ditangguhkan. Memanggil DdeEnableCallback menyebabkan DDEML mengirim ulang transaksi yang mengakibatkan aplikasi menangguhkan percakapan. Oleh karena itu, aplikasi harus menyimpan hasil transaksi singgahan sehingga dapat memperoleh dan mengembalikan hasilnya tanpa memproses ulang transaksi.

Aplikasi dapat menangguhkan semua transaksi yang terkait dengan handel percakapan tertentu dengan menentukan handel dan bendera EC_DISABLE dalam panggilan ke DdeEnableCallback. Dengan menentukan handel NULL , aplikasi dapat menangguhkan semua transaksi untuk semua percakapan.

Ketika percakapan telah ditangguhkan, DDEML menyimpan transaksi untuk percakapan dalam antrean transaksi. Ketika aplikasi mengaktifkan kembali percakapan, DDEML menghapus transaksi yang disimpan dari antrean dan meneruskan setiap transaksi ke fungsi panggilan balik yang sesuai. Kapasitas antrean transaksi besar, tetapi aplikasi harus mengaktifkan kembali percakapan yang ditangguhkan sesegera mungkin untuk menghindari kehilangan transaksi.

Aplikasi dapat melanjutkan pemrosesan transaksi biasa dengan menentukan bendera EC_ENABLEALL di DdeEnableCallback. Untuk memulai kembali pemrosesan transaksi yang lebih terkontrol, aplikasi dapat menentukan bendera EC_ENABLEONE. Bendera ini menghapus satu transaksi dari antrean transaksi dan meneruskannya ke fungsi panggilan balik yang sesuai; setelah transaksi tersebut diproses, percakapan apa pun kembali dinonaktifkan.

Jika bendera EC_ENABLEONE dan handel percakapan ditentukan dalam panggilan ke DdeEnableCallback, hanya percakapan tersebut yang diblokir setelah transaksi diproses. Jika handel percakapan NULL ditentukan, semua percakapan diblokir setelah transaksi diproses dalam percakapan apa pun.

Kelas Transaksi

DDEML memiliki empat kelas transaksi. Setiap kelas diidentifikasi oleh konstanta yang dimulai dengan awalan XCLASS_. Kelas ditentukan dalam file header DDEML. Nilai kelas dikombinasikan dengan nilai jenis transaksi dan diteruskan ke fungsi panggilan balik DDE dari aplikasi penerima.

Kelas transaksi menentukan nilai pengembalian yang diharapkan dikembalikan oleh fungsi panggilan balik jika memproses transaksi. Nilai pengembalian dan jenis transaksi berikut dikaitkan dengan masing-masing dari empat kelas transaksi.

Kelas Nilai hasil Transaksi
XCLASS_BOOL TRUE atau FALSE XTYP_ADVSTART
XTYP_CONNECT
XCLASS_DATA Handel data, kode pengembalian CBR_BLOCK, atau NULL XTYP_ADVREQ
XTYP_REQUEST
XTYP_WILDCONNECT
XCLASS_FLAGS Bendera transaksi: DDE_FACK, DDE_FBUSY, atau DDE_FNOTPROCESSED XTYP_ADVDATA
XTYP_EXECUTE
XTYP_POKE
XCLASS_NOTIFICATION Tidak XTYP_ADVSTOP
XTYP_CONNECT_CONFIRM
XTYP_DISCONNECT
XTYP_ERROR
XTYP_REGISTER
XTYP_UNREGISTER
XTYP_XACT_COMPLETE

Jenis Transaksi

Setiap jenis transaksi DDE memiliki penerima dan aktivitas terkait yang menyebabkan DDEML menghasilkan setiap jenis.

Jenis transaksi Penerima Penyebab
XTYP_ADVDATA Klien Server merespons transaksi XTYP_ADVREQ dengan mengembalikan handel data.
XTYP_ADVREQ Server Server yang disebut fungsi DdePostAdvise , menunjukkan bahwa nilai item data dalam perulangan saran telah berubah.
XTYP_ADVSTART Server Klien menentukan jenis transaksi XTYP_ADVSTART dalam panggilan ke fungsi DdeClientTransaction.
XTYP_ADVSTOP Server Klien menentukan jenis transaksi XTYP_ADVSTOP dalam panggilan ke DdeClientTransaction.
XTYP_CONNECT Server Klien yang disebut fungsi Dde Koneksi dan menentukan nama layanan dan nama topik yang didukung oleh server.
XTYP_CONNECT_CONFIRM Server Server mengembalikan TRUE sebagai respons terhadap transaksi XTYP_CONNECT atau XTYP_WILDCONNECT.
XTYP_DISCONNECT Klien/Server Mitra dalam percakapan yang disebut fungsi DdeDisconnect , menyebabkan kedua mitra menerima transaksi ini.
XTYP_ERROR Klien/Server Terjadi kesalahan kritis. DDEML mungkin tidak memiliki sumber daya yang memadai untuk melanjutkan.
XTYP_EXECUTE Server Klien menentukan jenis transaksi XTYP_EXECUTE dalam panggilan ke DdeClientTransaction.
XTYP_MONITOR Aplikasi pemantauan DDE Peristiwa DDE terjadi dalam sistem. Untuk informasi selengkapnya tentang aplikasi pemantauan DDE, lihat Memantau Aplikasi.
XTYP_POKE Server Klien menentukan jenis transaksi XTYP_POKE dalam panggilan ke DdeClientTransaction.
XTYP_REGISTER Klien/Server Aplikasi server menggunakan fungsi DdeNameService untuk mendaftarkan nama layanan.
XTYP_REQUEST Server Klien menentukan jenis transaksi XTYP_REQUEST dalam panggilan ke DdeClientTransaction.
XTYP_UNREGISTER Klien/Server Aplikasi server menggunakan DdeNameService untuk membatalkan pendaftaran nama layanan.
XTYP_WILDCONNECT Server Klien yang disebut fungsi Dde Koneksi atau Dde Koneksi List, menentukan NULL untuk nama layanan, nama topik, atau keduanya.
XTYP_XACT_COMPLETE Klien Transaksi asinkron, dikirim ketika klien menentukan bendera TIMEOUT_ASYNC dalam panggilan ke DdeClientTransaction, telah disimpulkan.