Megosztás a következőn keresztül:


Tudnivalók a dinamikus adatcseréről

A Windows számos módszert kínál az adatok alkalmazások közötti átvitelére. Az egyik módszer a Dynamic Data Exchange (DDE) protokoll használata. A DDE protokoll üzenetek és irányelvek készlete. Üzeneteket küld olyan alkalmazások között, amelyek adatokat osztanak meg, és megosztott memóriát használnak az adatok alkalmazások közötti cseréjéhez. Az alkalmazások a DDE protokollt használhatják egyszeri adatátvitelekhez és folyamatos cserékhez, amelyekben az alkalmazások frissítéseket küldenek egymásnak az új adatok elérhetővé válásakor.

A Windows a dinamikus adatcsere-kezelési kódtárat (DDEML) is támogatja. A DDEML egy dinamikus csatolású kódtár (DLL), amellyel az alkalmazások megoszthatják az adatokat. A DDEML olyan függvényeket és üzeneteket biztosít, amelyek leegyszerűsítik a DDE-képességek alkalmazáshoz való hozzáadásának feladatát. A DDE-üzenetek közvetlen küldése, közzététele és feldolgozása helyett egy alkalmazás a DDEML-függvényeket használja a DDE-beszélgetések kezeléséhez. (A DDE-beszélgetés az ügyfél- és kiszolgálóalkalmazások közötti interakció.)

A DDEML emellett lehetővé teszi a DDE-alkalmazások által megosztott sztringek és adatok kezelését. A DDE-alkalmazások ahelyett, hogy atomokat és mutatókat használnának a megosztott memóriaobjektumokhoz, sztringfogantyúkat hoznak létre és cserélnek, amelyek azonosítják a sztringeket, valamint adatfogantyúkat, amelyek azonosítják a memóriaobjektumokat. A DDEML lehetővé teszi azt is, hogy egy kiszolgálóalkalmazás regisztrálja a támogatott szolgáltatásneveket. A nevek a rendszer más alkalmazásaiba kerülnek, amelyek a nevek használatával csatlakozhatnak a kiszolgálóhoz. Emellett a DDEML biztosítja a kompatibilitást a DDE-alkalmazások között azáltal, hogy konzisztens módon kényszeríti őket a DDE protokoll implementálására.

Az üzenetalapú DDE protokollt használó meglévő alkalmazások teljes mértékben kompatibilisek a DDEML-t használó alkalmazásokkal. Vagyis az üzenetalapú DDE-t használó alkalmazások beszélgetéseket kezdeményezhetnek és tranzakciókat hajthatnak végre a DDEML-t használó alkalmazásokkal. A DDEML számos előnye miatt az új alkalmazásoknak a DDE-üzenetek helyett azt kell használniuk. A DDEML API-elemeinek használatához fel kell vennie a DDEML fejlécfájlt a forrásfájlokba, csatolnia kell a DDEML-kódtárat, és gondoskodnia kell arról, hogy a DDEML dinamikus csatolású kódtár a rendszer keresési útvonalán legyen.

Ebben a szakaszban az alábbi témaköröket tárgyaljuk.

Dinamikus adatcsere protokoll

Mivel a Windows üzenetalapú architektúrával rendelkezik, az üzenetek átadása a legmegfelelőbb módszer az adatok alkalmazások közötti automatikus átvitelére. Az üzenetek azonban csak két paramétert tartalmaznak (wParam és lParam) az adatok továbbításához. Ennek eredményeképpen ezeknek a paramétereknek közvetett módon más adatrészekre kell hivatkozniuk, amikor több szónyi információ kerül át az alkalmazások között. A DDE protokoll pontosan meghatározza, hogy az alkalmazások hogyan használják a wParam és lParam paramétereket, hogy nagyobb adatrészeket adjanak át globális atomok és megosztott memóriafogantyúk segítségével. A DDE protokoll speciális szabályokat tartalmaz a globális atomok és a megosztott memóriaobjektumok kiosztására és törlésére.

A globális atom egy karaktersztringre mutató hivatkozás. A DDE protokollban az atomok azonosítják az adatokat cserélő alkalmazásokat, a kicserélt adatok természetét és magukat az adatelemeket. További információ az atomokról: Az Atomok.

A Windows Dinamikus adatcsere használata

A DDE leginkább olyan adatcserékre alkalmas, amelyek nem igényelnek folyamatos felhasználói interakciót. Az alkalmazások általában módot biztosítanak a felhasználó számára az adatcserét végző alkalmazások közötti kapcsolat létrehozására. A hivatkozás létrehozása után azonban az alkalmazások további felhasználói beavatkozás nélkül cserélnek adatokat.

A DDE számos alkalmazásfunkció implementálható, például:

  • Összekapcsolás valós idejű adatokkal, például tőzsdei frissítésekkel, tudományos eszközökkel vagy folyamatvezérléssel.
  • Összetett dokumentumok, például egy grafikus alkalmazás által létrehozott diagramot tartalmazó szövegszerkesztő dokumentum létrehozása. A DDE használatával a diagram megváltozik a forrásadatok módosításakor, míg a dokumentum többi része ugyanaz marad.
  • Adat lekérdezések végrehajtása alkalmazások között, például egy számolótábla, amely lekérdezi az adatbázist a lejárt esedékességű fiókokhoz.

Dinamikus adatcsere a felhasználó szemszögéből

Az alábbi példa bemutatja, hogyan működhet együtt két DDE-alkalmazás a felhasználó szempontjából.

Egy táblázatkezelő felhasználó a Microsoft Excel használatával szeretné nyomon követni egy adott részvény árát a New York-i értéktőzsdén. A felhasználónak van egy Idézet nevű alkalmazása, amely viszont hozzáfér a NYSE-adatokhoz. Az Excel és az Quote közötti DDE-beszélgetés az alábbiak szerint zajlik:

  • A felhasználó úgy kezdeményezi a beszélgetést, hogy megadja annak az alkalmazásnak a nevét (Quote), amely megadja az adatokat és az adott érdeklődési témakört (NYSE). Az eredményként kapott DDE-beszélgetés adott részvényekre vonatkozó árajánlatok igénylésére szolgál.
  • Az Excel az alkalmazás és a témakör nevét a rendszerben jelenleg futó összes DDE-alkalmazásra szórja. Az idézet válaszol, és beszélgetést kezdeményez az Excellel a NYSE-témakörről.
  • A felhasználó ezután létrehozhat egy táblázatképletet egy cellában, amely azt kéri, hogy a számolótábla automatikusan frissüljön, amikor egy adott tőzsdei árfolyam megváltozik. A felhasználó például a következő Excel-képlet megadásával kérhet automatikus frissítést, ha változás történik a ZAXX-részvények eladási árában: ='Quote'|' NYSE'! ZAXX
  • A felhasználó bármikor leállíthatja a ZAXX részvényárfolyam automatikus frissítését. A külön létrehozott egyéb adatkapcsolatok (például más részvények árajánlatai) továbbra is aktívak maradnak ugyanabban a NYSE-beszélgetésben.
  • A felhasználó a NYSE-témakör Excel és Quote közötti teljes beszélgetését is megszakíthatja, így új beszélgetés kezdeményezése nélkül nem hozhatók létre konkrét adathivatkozások az adott témakörről.

A dinamikus adatcsere fogalmai

Az alábbi szakaszok ismertetik a dinamikus adatcsere megértéséhez kulcsfontosságú fogalmakat és terminológiát.

Ügyfél, kiszolgáló és beszélgetés

A DDE-ben részt vevő két alkalmazásról azt mondják, hogy DDE-beszélgetésben vesznek részt. A beszélgetést kezdeményező alkalmazás a DDE-ügyfélalkalmazás; az ügyfélre válaszoló alkalmazás a DDE-kiszolgálóalkalmazás. Az alkalmazások egyszerre több beszélgetésben is részt vehetnek, egyesekben ügyfélként, másokban pedig kiszolgálóként.

A DDE-beszélgetés két ablak között zajlik, egy-egy a részt vevő alkalmazásokhoz. Az alkalmazás főablaka lehet egy ablak; egy adott dokumentumhoz társított ablak, mint egy többdokumentumos felületi (MDI-) alkalmazásban; vagy egy rejtett (láthatatlan) ablak, amelynek egyetlen célja a DDE-üzenetek feldolgozása.

Mivel a DDE-beszélgetéseket a beszélgetésben részt vevő ablakokhoz tartozó fogópontok párja azonosítja, egyetlen ablakban sem lehet több beszélgetést folytatni egy másik ablakkal. Az ügyfélalkalmazásnak vagy a kiszolgálóalkalmazásnak egy másik ablakot kell biztosítania egy adott kiszolgálóval vagy ügyfélalkalmazással folytatott minden egyes beszélgetéséhez.

Az alkalmazások az egyes beszélgetések rejtett ablakának létrehozásával biztosíthatják, hogy az ügyfél- és kiszolgálóablakok soha ne vegyenek részt egynél több beszélgetésben. Ennek az ablaknak az egyetlen célja a DDE-üzenetek feldolgozása.

Alkalmazás-, témakör- és elemnevek

A DDE protokoll az ügyfél és a kiszolgáló között átadott adategységeket háromszintű alkalmazás-, témakör- és elemnevek hierarchiájával azonosítja.

Minden DDE-beszélgetést egyedileg határoz meg az alkalmazás neve és témaköre. A DDE-beszélgetés elején az ügyfél és a kiszolgáló határozza meg az alkalmazás nevét és témakörét. Az alkalmazás neve általában a kiszolgálóalkalmazás neve. Ha például az Excel kiszolgálóként működik egy beszélgetésben, az alkalmazás neve Excel.

A DDE-témakör az adatok általános besorolása, amelyen belül több adatelem is "megvitatható" (kicserélhető) a beszélgetés során. A fájlalapú dokumentumokon működő alkalmazások esetében a témakör általában fájlnév. Más alkalmazások esetében a témakör egy alkalmazásspecifikus név.

Mivel az ügyfél és a kiszolgáló ablaka együttesen azonosít egy DDE-beszélgetést, a beszélgetést meghatározó alkalmazásnév és témakör nem módosítható a beszélgetés során.

A DDE-adatelemek az alkalmazások között kicserélt beszélgetési témakörrel kapcsolatos információk. Az adatelem értékei átadhatók a kiszolgálóról az ügyfélnek vagy az ügyfélről a kiszolgálónak. Az adatok a szokásos vágólapformátumok bármelyikével vagy regisztrált vágólapformátummal továbbíthatók. A Hivatkozás nevű speciális, regisztrált formátum egy DDE-beszélgetés egy elemét azonosítja. A vágólap formátumairól további információt Vágólapcímű témakörben talál.

A rendszertéma

Az alkalmazásoknak mindig támogatniuk kell a rendszertémakört. Ez a témakör olyan információk kontextusát ismerteti, amelyek egy másik alkalmazás számára általánosan érdekesek lehetnek.

Az adatelem-értékeket CF_TEXT vágólap formátumban kell megjeleníteni. A rendszertémakör elemértékeinek egyes elemeit tabulátorkarakterek szerint kell elválasztani. Az alábbi táblázat a rendszertéma néhány elemére utal.

Cikk Leírás
Formátumok Az alkalmazás által megjeleníthető vágólapformátumok tabulátorral tagolt listája. A CF_ formátumok általában az eltávolított nevek "CF_" részével vannak felsorolva (például CF_TEXT "SZÖVEG").
Segítség A DDE-kiszolgáló használatát röviden ismertető szöveg.
Válaszüzenet A legutóbb használt WM_DDE_ACK üzenet támogató részlete. Ez az elem akkor hasznos, ha több mint nyolc bit alkalmazásspecifikus visszatérési adatra van szükség.
Állapot Az alkalmazás aktuális állapotának jelzése. Amikor egy kiszolgáló kap egy WM_DDE_REQUEST üzenetet ehhez a rendszertémakör-elemhez, a kiszolgálónak válaszolnia kell egy WM_DDE_DATA üzenet közzétételével, amely szükség szerint egy "Foglaltság" vagy "Kész" állapotot tartalmazó karakterláncot foglal magában.
SysItems Az alkalmazás által támogatott rendszertémakör-elemek listája.
Témaelemlista Hasonlóan a SysItems elemhez, azzal a kivétellel, hogy a TopicItemList-et a rendszertémakörön kívül minden témakör esetében támogatni kell. Ez lehetővé teszi a témakörökben támogatott elemek böngészését. Ha az elemeket nem lehet számba venni, ennek az elemnek csak a "TopicItemList" szöveget kell tartalmaznia.
Témák Az alkalmazás által jelenleg támogatott témakörök listája; ez a lista pillanatról pillanatra változhat.

 

A DDE-beszélgetés megkezdése után az ügyfél létrehozhat egy vagy több állandó adatkapcsolatot a kiszolgálóval. Az adatkapcsolat egy kommunikációs mechanizmus, amellyel a kiszolgáló értesíti az ügyfelet, amikor egy adott adatelem értéke megváltozik. Az adatkapcsolat abban az értelemben állandó, hogy ez az értesítési folyamat addig folytatódik, amíg az adatkapcsolat vagy maga a DDE-beszélgetés le nem fejeződik.

Kétféle állandó DDE-adatkapcsolat létezik: langyos és forró. Egy meleg adatkapcsolatban a kiszolgáló értesíti az ügyfelet, hogy az adatelem értéke megváltozott, de a kiszolgáló addig nem küldi el az adatértéket az ügyfélnek, amíg az ügyfél nem kéri. Egy gyakori adatkapcsolatban a kiszolgáló azonnal elküldi a módosított adatértéket az ügyfélnek.

Azokat az alkalmazásokat, amelyek támogatják a meleg vagy forró adathivatkozásokat, általában a Másolás vagy a Hivatkozás beillesztése parancsot kínálják a Szerkesztés menüben, hogy lehetővé tegyék a felhasználó számára az alkalmazások közötti kapcsolatok létrehozását.

Atomok és megosztott memóriaobjektumok

A DDE-üzenetek bizonyos argumentumai globális atomok vagy megosztott memóriaobjektumok. Az ezen argumentumokat használó alkalmazásoknak explicit szabályokat kell követniük a lefoglalásuk és törlésük időpontjára. Az üzenet küldőjének minden esetben törölnie kell minden olyan atom- vagy megosztott memóriaobjektumot, amelyet a címzett nem fog kapni hiba miatt, például a PostMessage függvény meghibásodása miatt.

A DDE három célra használ megosztott memóriaobjektumokat:

  • Egy kicserélendő adatérték hordozása. Ez a hData paraméter által hivatkozott elem a WM_DDE_DATA és WM_DDE_POKE üzenetekben.
  • Az üzenet opcióinak hordozása. Ez a hOptions paraméter által hivatkozott elem egy WM_DDE_ADVISE üzenetben.
  • Parancsvégrehajtási szöveg átvitele. Ez az az elem, amelyre a hCommands paraméter hivatkozik az WM_DDE_EXECUTE üzenetben, és a hozzá tartozó WM_DDE_ACK üzenetben.

Egy DDE megosztott memóriaobjektumot fogadó alkalmazásnak csak olvashatóként kell kezelnie. Az alkalmazás nem használhatja az objektumot közös írási-olvasási területként az adatok szabad cseréjéhez.

Ahogy egy DDE-atom esetén is, az alkalmazásnak szabadítson fel egy megosztott memóriaobjektumot a memória hatékony kezeléséhez. Az alkalmazásnak emellett zárolnia és feloldnia kell a memóriaobjektumokat.

Dinamikus adatcsere-üzenetek áttekintése

Mivel a DDE üzenetalapú protokoll, nem használ függvényeket vagy kódtárakat. Minden DDE-tranzakció bizonyos meghatározott DDE-üzenetek átadásával történik az ügyfél és a kiszolgálóablak között.

Kilenc DDE-üzenet van; az üzenetek szimbolikus állandói a DDE fejlécfájlban vannak definiálva. A különböző DDE-üzenetek bizonyos struktúrái is definiálva vannak ebben a fejlécfájlban.

Az alábbi táblázat összefoglalja a DDE-üzeneteket.

Üzenet Leírás
WM_DDE_ACK Nyugtázza az üzenet fogadását vagy nem fogadását.
WM_DDE_ADVISE Arra kéri a kiszolgálóalkalmazást, hogy adja meg az adatelem frissítését vagy értesítését, amikor az megváltozik. Ez állandó adatkapcsolatot hoz létre.
WM_DDE_DATA Adatelem-értéket küld az ügyfélalkalmazásnak.
WM_DDE_EXECUTE Sztringet küld a kiszolgálóalkalmazásnak, amely várhatóan parancsok sorozataként fogja feldolgozni a sztringet.
WM_DDE_INITIATE Beszélgetést kezdeményez az ügyfél- és kiszolgálóalkalmazások között.
WM_DDE_POKE Adatelem-értéket küld a kiszolgálóalkalmazásnak.
WM_DDE_REQUEST Kéri a kiszolgálóalkalmazást, hogy adja meg az adatelem értékét.
WM_DDE_TERMINATE Megszakít egy beszélgetést.
WM_DDE_UNADVISE Leállítja az állandó adatkapcsolatot.

 

Egy alkalmazás meghívja SendMessage, hogy kibocsátsa a WM_DDE_INITIATE üzenetet, vagy a WM_DDE_INITIATEválaszként küldött WM_DDE_ACK üzenetet. Minden más üzenetet PostMessageküld. Ezeknek a hívásoknak az első paramétere a fogadó ablak leírója; a második paraméter tartalmazza az elküldendő üzenetet; a harmadik paraméter azonosítja a küldő ablakot; és a negyedik paraméter tartalmazza az üzenetspecifikus argumentumokat.

Dinamikus adatcsere üzenetfolyama

Egy tipikus DDE-beszélgetés a következő eseményekből áll:

  1. Az ügyfélalkalmazás kezdeményezi a beszélgetést, és a kiszolgálóalkalmazás válaszol.

  2. Az alkalmazások az alábbi módszerek bármelyikével vagy mindegyikével cserélnek adatokat:

      • A kiszolgálóalkalmazás adatokat küld az ügyfélnek az ügyfél kérésére.
      • Az ügyfélalkalmazás kéretlen adatokat küld a kiszolgálóalkalmazásnak.
      • Az ügyfélalkalmazás arra kéri a kiszolgálóalkalmazást, hogy értesítse az ügyfelet, amikor megváltozik egy adatelem (meleg adatkapcsolat).
      • Az ügyfélalkalmazás arra kéri a kiszolgálóalkalmazást, hogy küldjön adatokat az adatok változásakor (gyakori elérésű adatkapcsolat).
      • A kiszolgálóalkalmazás parancsot hajt végre az ügyfél kérésére.
  3. Az ügyfél vagy a kiszolgálóalkalmazás leállítja a beszélgetést.

Az ügyféltől vagy kiszolgálótól érkező kéréseket feldolgozó alkalmazásablaknak szigorúan a beérkezésük sorrendjében kell feldolgoznia őket.

Az ügyfél több kiszolgálóval is kezdeményezhet beszélgetéseket; egy kiszolgáló több ügyféllel is folytathat beszélgetéseket. Egynél több forrásból érkező üzenetek kezelésekor az ügyfélnek vagy a kiszolgálónak szinkron módon kell feldolgoznia egy beszélgetés üzeneteit, de nem kell minden üzenetet szinkron módon feldolgoznia. Más szóval szükség szerint válthat az egyik beszélgetésről a másikra.

Ha egy alkalmazás nem tudja feldolgozni a bejövő kérést, mert DDE-választ vár, meg kell akadályoznia a holtpontot, ha egy WM_DDE_ACK üzenetet tesz közzé a fBusyDDEACK struktúrájának 1-es értékre beállított tagjával. Az alkalmazások akkor is küldhetnek elfoglalt WM_DDE_ACK üzenetet, ha bármilyen okból nem tudja feldolgozni a bejövő kéréseket ésszerű időn belül.

Az alkalmazásnak képesnek kell lennie kezelni azt, amikor egy ügyfél vagy kiszolgáló nem válaszol egy üzenetre egy meghatározott időn belül. Mivel az időtúllépési időköz az alkalmazás jellegétől és a felhasználó rendszerének konfigurációjától függően változhat (beleértve azt is, hogy csatlakozik-e hálózathoz), az alkalmazásnak módot kell biztosítania a felhasználó számára az időköz megadására.

Paraméter csomagoló függvények

A lParam paraméter számos DDE-üzenetben két adatrészt tartalmaz. Az WM_DDE_DATA üzenet lParam például egy leírót és egy atomot tartalmaz. Az alkalmazásoknak a PackDDElParam függvénnyel kell becsomagolniuk a fogópontot és az atomot egy lParam paraméterbe, az értékek eltávolításához pedig a UnpackDDElParam függvényt. A DDE-alkalmazásoknak PackDDElParam és UnpackDDElParam kell használniuk a DDE-beszélgetés során közzétett összes üzenethez.

Az alkalmazások használhatják a ReuseDDElParam és FreeDDElParam függvényeket is. ReuseDDElParam lehetővé teszi, hogy a DDE-alkalmazások újra felhasználjanak egy csomagolt lParam paramétert, ami csökkenti az alkalmazás által a beszélgetés során végrehajtandó memória-újraelosztások számát. Egy alkalmazás a FreeDDElParam használatával szabadíthatja fel a DDE-beszélgetés során kapott leíróhoz társított memóriát.

Dinamikus adatcsere és megszemélyesítés

Annak érdekében, hogy egy kiszolgáló megszemélyesíthesse az ügyfelet, az ügyfél meghívja a DdeSetQualityOfService függvényt. A SECURITY_IMPERSONATION_LEVEL struktúrával szabályozható a kiszolgáló által végrehajtott megszemélyesítés szintje.

A DDE-kiszolgálók megszemélyesíthetnek egy DDE-ügyfelet a ImpersonateDdeClientWindow függvény meghívásával. A DDEML-kiszolgálónak a DdeImpersonateClient függvényt kell használnia.