Konsep Dasar (DDE)

Konsep-konsep ini adalah kunci untuk memahami Dynamic Data Exchange (DDE) dan Dynamic Data Exchange Management Library (DDEML).

Interaksi Klien dan Server

DDE selalu terjadi antara aplikasi klien dan aplikasi server. Aplikasi klien DDE memulai pertukaran dengan membuat percakapan dengan server untuk mengirim transaksi ke server. Transaksi adalah permintaan untuk data atau layanan. Aplikasi server DDE merespons transaksi dengan menyediakan data atau layanan kepada klien. Misalnya, aplikasi grafis mungkin berisi grafik batang yang mewakili keuntungan triwulanan perusahaan, tetapi data untuk grafik batang mungkin terkandung dalam aplikasi spreadsheet. Untuk mendapatkan angka laba terbaru, aplikasi grafis (klien) dapat membuat percakapan dengan aplikasi spreadsheet (server). Aplikasi grafis kemudian dapat mengirim transaksi ke aplikasi spreadsheet, meminta angka laba terbaru.

Server dapat memiliki banyak klien secara bersamaan, dan klien dapat meminta data dari beberapa server. Aplikasi juga dapat berupa klien dan server. Klien atau server dapat mengakhiri percakapan kapan saja.

Transaksi dan Fungsi Panggilan Balik DDE

DDEML memberi tahu aplikasi tentang aktivitas DDE yang memengaruhi aplikasi dengan mengirim transaksi ke fungsi panggilan balik DDE aplikasi. Transaksi DDE mirip dengan pesan, itu adalah konstanta bernama yang disertai dengan parameter lain yang berisi informasi tambahan tentang transaksi.

DDEML meneruskan transaksi ke fungsi panggilan balik DDE yang ditentukan aplikasi yang melakukan tindakan yang sesuai dengan jenis transaksi. Misalnya, ketika aplikasi klien mencoba membuat percakapan dengan aplikasi server, klien memanggil fungsi Dde Koneksi. Fungsi ini menyebabkan DDEML mengirim transaksi XTYP_CONNECT ke fungsi panggilan balik DDE server. Fungsi panggilan balik dapat memungkinkan percakapan dengan mengembalikan TRUE ke DDEML, atau dapat menolak percakapan dengan mengembalikan FALSE. Untuk diskusi terperinci tentang transaksi, lihat Manajemen Transaksi.

Nama Layanan, Nama Topik, dan Nama Item

Server DDE menggunakan nama layanan hierarki tiga tingkat (disebut "nama aplikasi" dalam dokumentasi DDE sebelumnya), nama topik, dan nama item untuk mengidentifikasi unit data yang dapat ditukarkan secara unik oleh server selama percakapan.

Nama layanan adalah string yang ditanggapi aplikasi server ketika klien mencoba membuat percakapan dengan server. Klien harus menentukan nama layanan ini untuk membuat percakapan dengan server. Meskipun server dapat menanggapi banyak nama layanan, sebagian besar server hanya merespons satu nama.

Nama topik adalah string yang mengidentifikasi konteks data logis. Untuk server yang beroperasi pada dokumen berbasis file, nama topik biasanya merupakan nama file; untuk server lain, mereka adalah string khusus aplikasi lainnya. Klien harus menentukan nama topik bersama dengan nama layanan server saat mencoba membuat percakapan dengan server.

Nama item adalah string yang mengidentifikasi unit data yang dapat diteruskan ke klien selama transaksi. Misalnya, nama item mungkin mengidentifikasi bilangan bulat, string, beberapa paragraf teks, atau bitmap.

Nama layanan, topik, dan item memungkinkan klien untuk membuat percakapan dengan server dan menerima data dari server.

Topik Sistem

Topik Sistem menyediakan konteks untuk informasi kepentingan umum kepada klien DDE mana pun. Disarankan agar aplikasi server mendukung topik Sistem setiap saat. Topik Sistem didefinisikan dalam DDEML. File header H sebagai SZDDESYS_TOPIC.

Untuk menentukan server mana yang ada dan jenis informasi yang dapat mereka berikan, aplikasi klien dapat meminta percakapan tentang topik Sistem saat memulai, mengatur nama perangkat ke NULL. Percakapan kartubebas tersebut mahal dalam hal performa sistem, sehingga harus dijaga seminimal mungkin. Untuk informasi selengkapnya tentang memulai percakapan DDE, lihat Manajemen Percakapan.

Server harus mendukung nama item berikut dalam topik Sistem dan nama item lain yang berguna untuk klien.

Item Deskripsi
SZDDE_ITEM_ITEMLIST Daftar item yang didukung di bawah topik non-Sistem. (Daftar ini dapat bervariasi dari saat ke saat dan dari topik ke topik.)
SZDDESYS_ITEM_FORMATS Daftar string yang dibatasi tab yang mewakili semua format clipboard yang berpotensi didukung oleh aplikasi layanan. String yang mewakili format clipboard yang telah ditentukan sebelumnya setara dengan nilai CF_ dengan awalan "CF_" dihapus. Misalnya, format CF_TEXT diwakili oleh string "TEXT". String ini harus dalam huruf besar untuk mengidentifikasinya lebih lanjut sebagai format yang telah ditentukan sebelumnya. Daftar format harus muncul dalam urutan konten yang paling kaya untuk konten yang paling tidak kaya. Untuk informasi selengkapnya tentang format clipboard dan data penyajian, lihat Clipboard.
SZDDESYS_ITEM_HELP Informasi minat umum yang dapat dibaca pengguna. Item ini harus berisi, minimal, informasi tentang cara menggunakan fitur DDE aplikasi server. Informasi ini dapat mencakup, tetapi tidak terbatas pada, cara menentukan item dalam topik, string eksekusi apa yang dapat dilakukan server, transaksi poke apa yang diizinkan, dan cara menemukan bantuan pada item topik Sistem lainnya.
SZDDESYS_ITEM_RTNMSG Detail pendukung untuk pesan WM_DDE_ACK yang terakhir digunakan. Item ini berguna ketika diperlukan lebih dari 8 bit data pengembalian khusus aplikasi.
SZDDESYS_ITEM_STATUS Indikasi status server saat ini. Biasanya, item ini hanya mendukung format CF_TEXT dan berisi string Siap atau Sibuk.
SZDDESYS_ITEM_SYSITEMS Daftar item yang didukung di bawah topik Sistem oleh server ini.
SZDDESYS_ITEM_TOPICS Daftar topik yang didukung oleh server pada saat ini. (Daftar ini dapat bervariasi dari saat ke saat.)

Nama item ini adalah nilai yang ditentukan dalam DDEML. File header H. Untuk mendapatkan handel string ke string ini, aplikasi harus menggunakan fungsi manajemen string DDEML, seperti halnya untuk string lain dalam aplikasi DDEML. Untuk informasi selengkapnya tentang mengelola string, lihat Manajemen String.

Inisialisasi

Sebelum memanggil fungsi DDEML lainnya, aplikasi harus memanggil fungsi DdeInitialize. DdeInitialize mendapatkan pengidentifikasi instans untuk aplikasi, mendaftarkan fungsi panggilan balik DDE aplikasi dengan DDE, dan menentukan bendera filter transaksi untuk fungsi panggilan balik.

Setiap instans aplikasi atau DLL harus meneruskan pengidentifikasi instansnya sebagai parameter idInst ke fungsi DDEML lain yang memerlukannya. Tujuan dari beberapa instans DDEML adalah untuk mendukung DLL yang harus menggunakan DDEML pada saat yang sama aplikasi menggunakannya. Aplikasi tidak boleh menggunakan lebih dari satu instans DDEML.

Filter transaksi mengoptimalkan performa sistem dengan mencegah DDEML meneruskan transaksi yang tidak diinginkan ke fungsi panggilan balik DDE aplikasi. Aplikasi mengatur filter transaksi dalam parameter DdeInitializeufCmd. Aplikasi harus menentukan bendera filter transaksi untuk setiap jenis transaksi yang tidak diproses dalam fungsi panggilan baliknya. Aplikasi dapat mengubah filter transaksinya dengan panggilan berikutnya ke DdeInitialize. Untuk informasi selengkapnya tentang transaksi, lihat Manajemen Transaksi.

Contoh berikut menunjukkan cara menginisialisasi aplikasi untuk menggunakan DDEML.

DWORD idInst = 0; 
HINSTANCE hinst; 
 
DdeInitialize(&idInst,         // receives instance identifier 
    (PFNCALLBACK) DdeCallback, // pointer to callback function 
    CBF_FAIL_EXECUTES |        // filter XTYPE_EXECUTE 
    CBF_SKIP_ALLNOTIFICATIONS, // filter notifications 
    0); 

Aplikasi harus memanggil fungsi DdeUninitialize ketika tidak lagi menggunakan DDEML. Fungsi ini mengakhiri percakapan apa pun yang saat ini terbuka untuk aplikasi dan membebaskan sumber daya DDEML yang dialokasikan sistem untuk aplikasi.

Fungsi Panggilan Balik

Aplikasi yang menggunakan DDEML harus menyediakan fungsi panggilan balik yang memproses peristiwa DDE yang memengaruhi aplikasi. DDEML memberi tahu aplikasi peristiwa tersebut dengan mengirim transaksi ke fungsi panggilan balik DDE aplikasi. Transaksi yang diterima fungsi panggilan balik bergantung pada filter panggilan balik mana yang menandai aplikasi yang ditentukan dalam DdeInitialize dan apakah aplikasi adalah klien, server, atau keduanya. Untuk informasi selengkapnya, silakan lihat DdeCallback.

Contoh berikut menunjukkan struktur umum fungsi panggilan balik untuk aplikasi klien biasa.

HDDEDATA CALLBACK DdeCallback(uType, uFmt, hconv, hsz1, 
    hsz2, hdata, dwData1, dwData2) 
UINT uType;       // transaction type 
UINT uFmt;        // clipboard data format 
HCONV hconv;      // handle to conversation 
HSZ hsz1;         // handle to string 
HSZ hsz2;         // handle to string 
HDDEDATA hdata;   // handle to global memory object 
DWORD dwData1;    // transaction-specific data 
DWORD dwData2;    // transaction-specific data 
{ 
    switch (uType) 
    { 
        case XTYP_REGISTER: 
        case XTYP_UNREGISTER: 
            . 
            . 
            . 
            return (HDDEDATA) NULL; 
 
        case XTYP_ADVDATA: 
            . 
            . 
            . 
            return (HDDEDATA) DDE_FACK; 
 
        case XTYP_XACT_COMPLETE: 
            
            // 
            
            return (HDDEDATA) NULL; 
 
        case XTYP_DISCONNECT: 
            
            // 
            
            return (HDDEDATA) NULL; 
 
        default: 
            return (HDDEDATA) NULL; 
    } 
} 

Parameter uType menentukan jenis transaksi yang dikirim ke fungsi panggilan balik oleh DDEML. Nilai parameter yang tersisa bergantung pada jenis transaksi. Jenis transaksi dan peristiwa yang menghasilkannya dijelaskan dalam topik berikut. Untuk informasi terperinci tentang setiap jenis transaksi, lihat Manajemen Transaksi.

Manajemen String

Untuk melakukan tugas DDE, banyak fungsi DDEML memerlukan akses ke string. Misalnya, klien harus menentukan nama layanan dan nama topik saat memanggil fungsi Dde Koneksi untuk meminta percakapan dengan server. Aplikasi menentukan string dengan meneruskan handel string (HSZ) daripada pointer dalam fungsi DDEML. Handel string adalah nilai DWORD, yang ditetapkan oleh sistem, yang mengidentifikasi string.

Aplikasi dapat memperoleh handel string ke string tertentu dengan memanggil fungsi DdeCreateStringHandle. Fungsi ini mendaftarkan string dengan sistem dan mengembalikan handel string ke aplikasi. Aplikasi dapat meneruskan handel ke fungsi DDEML yang harus mengakses string. Contoh berikut mendapatkan handel string ke string topik Sistem dan string nama layanan.

HSZ hszServName; 
HSZ hszSysTopic; 
hszServName = DdeCreateStringHandle( 
    idInst,         // instance identifier 
    "MyServer",     // string to register 
    CP_WINANSI);    // Windows ANSI code page 
 
hszSysTopic = DdeCreateStringHandle( 
    idInst,         // instance identifier 
    SZDDESYS_TOPIC, // System topic 
    CP_WINANSI);    // Windows ANSI code page 
    

Parameter idInst dalam contoh sebelumnya menentukan pengidentifikasi instans yang diperoleh oleh fungsi DdeInitialize .

Fungsi panggilan balik DDE aplikasi menerima satu atau beberapa handel string selama sebagian besar transaksi DDE. Misalnya, server menerima dua handel string selama transaksi XTYP_REQUEST : satu mengidentifikasi string yang menentukan nama topik, dan yang lain mengidentifikasi string yang menentukan nama item. Aplikasi dapat memperoleh panjang string yang sesuai dengan handel string dan menyalin string ke buffer yang ditentukan aplikasi dengan memanggil fungsi DdeQueryString , seperti yang ditunjukkan dalam contoh berikut.

DWORD idInst; 
DWORD cb; 
HSZ hszServ; 
PSTR pszServName; 
cb = DdeQueryString(idInst, hszServ, (LPSTR) NULL, 0, 
    CP_WINANSI) + 1; 
pszServName = (PSTR) LocalAlloc(LPTR, (UINT) cb); 
DdeQueryString(idInst, hszServ, pszServName, cb, CP_WINANSI); 

Handel string khusus instans tidak dapat dipetakan dari handel string ke string dan kembali ke handel string. Misalnya, meskipun DdeQueryString membuat string dari handel string dan kemudian DdeCreateStringHandle membuat handel string dari string tersebut, kedua handel tidak sama, seperti yang ditunjukkan dalam contoh berikut.

DWORD idInst; 
DWORD cb; 
HSZ hszInst, hszNew; 
PSZ pszInst; 
DdeQueryString(idInst, hszInst, pszInst, cb, CP_WINANSI); 
hszNew = DdeCreateStringHandle(idInst, pszInst, CP_WINANSI); 
// hszNew != hszInst ! 

Untuk membandingkan nilai dua handel string, gunakan fungsi DdeCmpStringHandles.

Handel string yang diteruskan ke fungsi panggilan balik DDE aplikasi menjadi tidak valid saat fungsi panggilan balik kembali. Aplikasi dapat menyimpan handel string untuk digunakan setelah fungsi panggilan balik kembali dengan menggunakan fungsi DdeKeepStringHandle.

Ketika aplikasi memanggil DdeCreateStringHandle, sistem memasukkan string yang ditentukan ke dalam tabel string dan menghasilkan handel yang digunakannya untuk mengakses string. Sistem juga mempertahankan jumlah penggunaan untuk setiap string dalam tabel string.

Ketika aplikasi memanggil DdeCreateStringHandle dan menentukan string yang sudah ada dalam tabel, sistem menambah jumlah penggunaan daripada menambahkan kemunculan lain dari string. (Aplikasi juga dapat menaikkan jumlah penggunaan dengan menggunakan DdeKeepStringHandle.) Ketika aplikasi memanggil fungsi DdeFreeStringHandle , sistem mengurangi jumlah penggunaan.

String dihapus dari tabel saat jumlah penggunaannya sama dengan nol. Karena lebih dari satu aplikasi dapat memperoleh handel ke string tertentu, aplikasi tidak boleh membebaskan handel string lebih banyak kali daripada yang telah dibuat atau mempertahankan handel. Jika tidak, aplikasi dapat menyebabkan string dihapus dari tabel, menolak akses aplikasi lain ke string.

Fungsi manajemen string DDEML didasarkan pada manajer atom dan tunduk pada batasan ukuran yang sama seperti atom.

DDEML dan Utas

Fungsi DdeInitialize mendaftarkan aplikasi dengan DDEML, membuat instans DDEML. Instans DDEML berbasis utas, yang terkait dengan utas yang disebut DdeInitialize.

Semua panggilan fungsi DDEML untuk objek milik instans DDEML harus dibuat dari utas yang sama yang disebut DdeInitialize untuk membuat instans. Jika Anda memanggil fungsi DDEML dari utas yang berbeda, fungsi akan gagal. Anda tidak dapat mengakses percakapan DDEML dari utas selain percakapan yang dialokasikan.