Bagikan melalui


Manajemen Percakapan

Percakapan antara klien dan server selalu dibuat atas permintaan klien. Saat percakapan dibuat, setiap mitra menerima handel yang mengidentifikasi percakapan. Mitra menggunakan handel ini di fungsi Dynamic Data Exchange Management Library (DDEML) lainnya untuk mengirim transaksi dan mengelola percakapan. Klien dapat meminta percakapan dengan satu server, atau dapat meminta beberapa percakapan dengan satu atau beberapa server.

Topik berikut menjelaskan bagaimana aplikasi membuat percakapan baru dan mendapatkan informasi tentang percakapan yang sudah ada.

Percakapan Tunggal

Aplikasi klien meminta satu percakapan dengan server dengan memanggil fungsi Dde Koneksi dan menentukan handel string yang mengidentifikasi string yang berisi nama layanan aplikasi server dan nama topik untuk percakapan. DDEML merespons dengan mengirim transaksi XTYP_CONNECT ke fungsi panggilan balik Dynamic Data Exchange (DDE) dari setiap aplikasi server yang telah mendaftarkan nama layanan yang cocok dengan yang ditentukan dalam Dde Koneksi atau telah menonaktifkan pemfilteran nama layanan dengan memanggil DdeNameService. Server juga dapat memfilter XTYP_CONNECT transaksi dengan menentukan bendera filter CBF_FAIL_CONNECTIONS dalam fungsi DdeInitialize. Selama transaksi XTYP_CONNECT, DDEML meneruskan nama layanan dan nama topik ke server. Server harus memeriksa nama dan mengembalikan TRUE jika mendukung nama layanan dan pasangan nama topik atau FALSE jika tidak.

Jika tidak ada server yang merespons secara positif permintaan klien untuk terhubung, klien menerima NULL dari Dde Koneksi dan tidak ada percakapan yang dibuat. Jika server mengembalikan TRUE, percakapan dibuat dan klien menerima handel percakapan — nilai DWORD yang mengidentifikasi percakapan. Klien menggunakan handel dalam panggilan DDEML berikutnya untuk mendapatkan data dari server. Server menerima transaksi XTYP_CONNECT_CONFIRM (kecuali server menentukan bendera filter CBF_SKIP_CONNECT_CONFIRMS). Transaksi ini meneruskan handel percakapan ke server.

Contoh berikut meminta percakapan tentang topik Sistem dengan server yang mengenali nama layanan MyServer. Parameter hszServName dan hszSysTopic sebelumnya dibuat handel string.

HCONV hConv;         // conversation handle 
HWND hwndParent;     // parent window handle 
HSZ hszServName;     // service name string handle 
HSZ hszSysTopic;     // System topic string handle 
 
hConv = DdeConnect( 
    idInst,               // instance identifier 
    hszServName,          // service name string handle 
    hszSysTopic,          // System topic string handle 
    (PCONVCONTEXT) NULL); // use default context 
 
if (hConv == NULL) 
{ 
    MessageBox(hwndParent, "MyServer is unavailable.", 
        (LPSTR) NULL, MB_OK); 
    return FALSE; 
} 

Dalam contoh sebelumnya, Dde Koneksi menyebabkan fungsi panggilan balik DDE aplikasi MyServer menerima transaksi XTYP_CONNECT.

Dalam contoh berikut, server merespons transaksi XTYP_CONNECT dengan membandingkan string nama topik menangani DDEML yang diteruskan ke server dengan setiap elemen dalam array string nama topik menangani dukungan server. Jika server menemukan kecocokan, server akan membuat percakapan.

#define CTOPICS 5 
 
HSZ hsz1;                  // string handle passed by DDEML 
HSZ ahszTopics[CTOPICS];   // array of supported topics 
int i;                     // loop counter 
 
// Use a switch statement to examine transaction types. 
// Here is the connect case.
 
    case XTYP_CONNECT: 
        for (i = 0; i < CTOPICS; i++) 
        { 
            if (hsz1 == ahszTopics[i]) 
                return TRUE;   // establish a conversation 
        } 
 
        return FALSE; // Topic not supported; deny conversation.  
 
// Process other transaction types. 

Jika server mengembalikan TRUE sebagai respons terhadap transaksi XTYP_CONNECT, DDEML mengirimkan transaksi XTYP_CONNECT_CONFIRM ke fungsi panggilan balik DDE server. Server dapat memperoleh handel ke percakapan dengan memproses transaksi ini.

Klien dapat membuat percakapan kartubebas dengan menentukan NULL untuk handel string nama layanan, handel string nama topik, atau keduanya dalam panggilan ke Dde Koneksi. Jika setidaknya salah satu handel string adalah NULL, DDEML mengirimkan transaksi XTYP_WILDCONNECT ke fungsi panggilan balik semua aplikasi DDE (kecuali yang memfilter transaksi XTYP_WILDCONNECT). Setiap aplikasi server harus merespons dengan mengembalikan handel data yang mengidentifikasi array struktur HSZPAIR yang dihentikan null. Jika aplikasi server belum memanggil DdeNameService untuk mendaftarkan nama layanannya dan jika pemfilteran aktif, server tidak menerima transaksi XTYP_WILDCONNECT. Untuk informasi selengkapnya tentang penanganan data, lihat Manajemen Data.

Array harus berisi satu struktur untuk setiap nama layanan dan pasangan nama topik yang cocok dengan pasangan yang ditentukan oleh klien. DDEML memilih salah satu pasangan untuk membuat percakapan dan kembali ke klien handel yang mengidentifikasi percakapan. DDEML mengirimkan transaksi XTYP_CONNECT_CONFIRM ke server (kecuali server memfilter transaksi ini). Contoh berikut menunjukkan respons server umum terhadap transaksi XTYP_WILDCONNECT.

#define CTOPICS 2 
 
UINT uType; 
HSZPAIR ahszp[(CTOPICS + 1)]; 
HSZ ahszTopicList[CTOPICS]; 
HSZ hszServ, hszTopic; 
WORD i, j; 
 
if (uType == XTYP_WILDCONNECT) 
{ 
    // Scan the topic list and create an array of HSZPAIR structures. 
 
    j = 0; 
    for (i = 0; i < CTOPICS; i++) 
    { 
        if (hszTopic == (HSZ) NULL || 
                hszTopic == ahszTopicList[i]) 
        { 
            ahszp[j].hszSvc = hszServ; 
            ahszp[j++].hszTopic = ahszTopicList[i]; 
        } 
    } 
 
    // End the list with an HSZPAIR structure that contains NULL 
    // string handles as its members. 
 
    ahszp[j].hszSvc = NULL; 
    ahszp[j++].hszTopic = NULL; 
 
    // Return a handle to a global memory object containing the 
    // HSZPAIR structures. 
 
    return DdeCreateDataHandle( 
        idInst,          // instance identifier 
        (LPBYTE) &ahszp, // pointer to HSZPAIR array 
        sizeof(HSZ) * j, // length of the array 
        0,               // start at the beginning 
        (HSZ) NULL,      // no item name string 
        0,               // return the same format 
        0);              // let the system own it 
} 

Klien atau server dapat mengakhiri percakapan kapan saja dengan memanggil fungsi DdeDisconnect. Fungsi ini menyebabkan fungsi panggilan balik mitra dalam percakapan menerima transaksi XTYP_DISCONNECT (kecuali mitra menentukan bendera filter CBF_SKIP_DISCONNECTS). Biasanya, aplikasi merespons transaksi XTYP_DISCONNECT dengan menggunakan fungsi DdeQueryConvInfo untuk mendapatkan informasi tentang percakapan yang dihentikan. Setelah fungsi panggilan balik kembali dari pemrosesan transaksi XTYP_DISCONNECT , handel percakapan tidak lagi valid.

Aplikasi klien yang menerima transaksi XTYP_DISCONNECT dalam fungsi panggilan balik DDE-nya dapat mencoba membangun kembali percakapan dengan memanggil fungsi DdeReconnect. Klien harus memanggil DdeReconnect dari dalam fungsi panggilan balik DDE-nya.

Beberapa Percakapan

Aplikasi klien dapat menggunakan fungsi Dde Koneksi List untuk menentukan apakah ada server yang menarik yang tersedia dalam sistem. Klien menentukan nama layanan dan nama topik saat memanggil Dde Koneksi List, menyebabkan DDEML menyiarkan transaksi XTYP_WILDCONNECT ke fungsi panggilan balik DDE dari semua server yang cocok dengan nama layanan (kecuali yang memfilter transaksi). Fungsi panggilan balik server harus mengembalikan handel data yang mengidentifikasi array struktur HSZPAIR yang dihentikan null. Array harus berisi satu struktur untuk setiap nama layanan dan pasangan nama topik yang cocok dengan pasangan yang ditentukan oleh klien. DDEML membuat percakapan untuk setiap struktur HSZPAIR yang diisi oleh server dan mengembalikan handel daftar percakapan ke klien. Server menerima handel percakapan dengan cara transaksi XTYP_CONNECT (kecuali server memfilter transaksi ini).

Klien dapat menentukan NULL untuk nama layanan, nama topik, atau keduanya saat memanggil Dde Koneksi List. Jika nama layanan NULL, semua server dalam sistem yang mendukung nama topik yang ditentukan merespons. Percakapan dibuat dengan setiap server yang merespons, termasuk beberapa instans server yang sama. Jika nama topik adalah NULL, percakapan dibuat pada setiap topik yang dikenali oleh setiap server yang cocok dengan nama layanan.

Klien dapat menggunakan fungsi DdeQueryNextServer dan DdeQueryConvInfo untuk mengidentifikasi server yang merespons Dde Koneksi List. DdeQueryNextServer mengembalikan handel percakapan berikutnya dalam daftar percakapan, dan DdeQueryConvInfo mengisi struktur CONVINFO dengan informasi tentang percakapan. Klien dapat menyimpan handel percakapan yang dibutuhkan dan membuang sisanya dari daftar percakapan.

Contoh berikut menggunakan Dde Koneksi List untuk membuat percakapan dengan semua server yang mendukung topik Sistem lalu menggunakan fungsi DdeQueryNextServer dan DdeQueryConvInfo untuk mendapatkan string nama layanan server menangani dan menyimpannya dalam buffer.

HCONVLIST hconvList; // conversation list 
DWORD idInst;        // instance identifier 
HSZ hszSystem;       // System topic 
HCONV hconv = NULL;  // conversation handle 
CONVINFO ci;         // holds conversation data 
UINT cConv = 0;      // count of conv. handles 
HSZ *pHsz, *aHsz;    // point to string handles 
 
// Connect to all servers that support the System topic. 
 
hconvList = DdeConnectList(idInst, NULL, hszSystem, NULL, NULL); 
 
// Count the number of handles in the conversation list. 
 
while ((hconv = DdeQueryNextServer(hconvList, hconv)) != NULL) 
    cConv++; 
 
// Allocate a buffer for the string handles. 
 
hconv = NULL; 
aHsz = (HSZ *) LocalAlloc(LMEM_FIXED, cConv * sizeof(HSZ)); 
 
// Copy the string handles to the buffer. 
 
pHsz = aHsz; 
while ((hconv = DdeQueryNextServer(hconvList, hconv)) != NULL) 
{ 
    DdeQueryConvInfo(hconv, QID_SYNC, (PCONVINFO) &ci); 
    DdeKeepStringHandle(idInst, ci.hszSvcPartner); 
    *pHsz++ = ci.hszSvcPartner; 
} 
 
// Use the handles; converse with the servers. 
 
// Free the memory and terminate the conversations. 
 
LocalFree((HANDLE) aHsz); 
DdeDisconnectList(hconvList); 

Aplikasi dapat mengakhiri percakapan individual dalam daftar percakapan dengan memanggil fungsi DdeDisconnect. Aplikasi dapat mengakhiri semua percakapan dalam daftar percakapan dengan memanggil fungsi DdeDisconnectList. Kedua fungsi tersebut menyebabkan DDEML mengirim transaksi XTYP_DISCONNECT ke fungsi panggilan balik DDE masing-masing mitra. DdeDisconnectList mengirimkan transaksi XTYP_DISCONNECT untuk setiap handel percakapan dalam daftar.

Klien dapat mengambil daftar handel percakapan dalam daftar percakapan dengan meneruskan handel daftar percakapan yang ada ke Dde Koneksi List. Proses enumerasi menghapus handel percakapan yang dihentikan dari daftar, dan percakapan nonduplikasi yang sesuai dengan nama layanan dan nama topik yang ditentukan ditambahkan.

Jika Dde Koneksi List menentukan handel daftar percakapan yang sudah ada, fungsi membuat daftar percakapan baru yang berisi handel percakapan baru dan handel dari daftar yang sudah ada.

Jika ada percakapan duplikat, Dde Koneksi List mencoba mencegah handel percakapan duplikat dalam daftar percakapan. Percakapan duplikat adalah percakapan kedua dengan server yang sama pada nama layanan dan nama topik yang sama. Dua percakapan tersebut akan memiliki pegangan yang berbeda, namun mereka akan mengidentifikasi percakapan yang sama.