Delen via


Over dynamische gegevensuitwisseling

Windows biedt verschillende methoden voor het overdragen van gegevens tussen toepassingen. Een methode is om het DDE-protocol (Dynamic Data Exchange) te gebruiken. Het DDE-protocol is een set berichten en richtlijnen. Er worden berichten verzonden tussen toepassingen die gegevens delen en gedeeld geheugen gebruiken om gegevens uit te wisselen tussen toepassingen. Toepassingen kunnen het DDE-protocol gebruiken voor eenmalige gegevensoverdracht en voor continue uitwisselingen waarin toepassingen updates naar elkaar verzenden wanneer er nieuwe gegevens beschikbaar komen.

Windows ondersteunt ook de Dynamic Data Exchange Management Library (DDEML). DDEML is een DLL (Dynamic Link Library) die toepassingen kunnen gebruiken om gegevens te delen. DDEML biedt functies en berichten waarmee de taak van het toevoegen van DDE-functionaliteit aan een toepassing wordt vereenvoudigd. In plaats van DDE-berichten rechtstreeks te verzenden, te posten en te verwerken, gebruikt een toepassing de DDEML-functies om DDE-gesprekken te beheren. (Een DDE-gesprek is de interactie tussen client- en servertoepassingen.)

DDEML biedt ook een faciliteit voor het beheren van de tekenreeksen en gegevens die DDE-toepassingen delen. In plaats van atomen en aanwijzers te gebruiken voor gedeelde geheugenobjecten, maken en uitwisselen DDE-toepassingen tekenreeksgrepen, waarmee tekenreeksen en gegevensgrepen worden geïdentificeerd, waarmee geheugenobjecten worden geïdentificeerd. De DDEML maakt het ook mogelijk voor een servertoepassing om de servicenamen te registreren die worden ondersteund. De namen worden uitgezonden naar andere toepassingen in het systeem, die de namen kunnen gebruiken om verbinding te maken met de server. Bovendien zorgt de DDEML voor compatibiliteit tussen DDE-toepassingen door ze af te dwingen het DDE-protocol op een consistente manier te implementeren.

Bestaande toepassingen die gebruikmaken van het DDE-protocol op basis van berichten, zijn volledig compatibel met toepassingen die gebruikmaken van DDEML. Dat wil gezegd, een toepassing die gebruikmaakt van op berichten gebaseerde DDE kan gesprekken tot stand brengen en transacties uitvoeren met toepassingen die gebruikmaken van DDEML. Vanwege de vele voordelen van DDEML moeten nieuwe toepassingen deze gebruiken in plaats van de DDE-berichten. Als u de API-elementen van de DDEML wilt gebruiken, moet u het DDEML-headerbestand opnemen in uw bronbestanden, een koppeling maken met de DDEML-bibliotheek en ervoor zorgen dat de DDEML dynamic-link-bibliotheek zich in het zoekpad van het systeem bevindt.

De volgende onderwerpen worden in deze sectie besproken.

Dynamic Data Exchange Protocol

Omdat Windows een architectuur op basis van berichten heeft, is het doorgeven van berichten de meest geschikte methode voor het automatisch overdragen van informatie tussen toepassingen. Berichten bevatten echter slechts twee parameters (wParam en lParam) voor het doorgeven van gegevens. Als gevolg hiervan moeten deze parameters indirect verwijzen naar andere stukjes gegevens wanneer er meer dan een paar woorden informatie tussen toepassingen worden doorgegeven. Het DDE-protocol definieert precies hoe toepassingen de wParam- en lParam parameters moeten gebruiken om grotere stukjes gegevens door te geven door middel van globale atomen en gedeelde geheugeningangen. Het DDE-protocol heeft specifieke regels voor het toewijzen en verwijderen van globale atomen en gedeelde geheugenobjecten.

Een globaal atoom is een verwijzing naar een tekenreeks. In het DDE-protocol identificeren atomen de toepassingen die gegevens uitwisselen, de aard van de gegevens die worden uitgewisseld en de gegevensitems zelf. Zie Over atomenvoor meer informatie over atomen.

Wordt gebruikt voor Windows Dynamic Data Exchange

DDE is het meest geschikt voor gegevensuitwisseling die geen doorlopende gebruikersinteractie vereisen. Meestal biedt een toepassing een methode waarmee de gebruiker de koppeling tot stand brengt tussen de toepassingen die gegevens uitwisselen. Zodra deze koppeling tot stand is gebracht, wisselen de toepassingen echter gegevens uit zonder verdere tussenkomst van de gebruiker.

DDE kan worden gebruikt om een breed scala aan toepassingsfuncties te implementeren, bijvoorbeeld:

  • Koppelen aan realtime gegevens, zoals updates op de aandelenmarkt, wetenschappelijke instrumenten of procescontrole.
  • Samengestelde documenten maken, zoals een tekstverwerkingsdocument dat een grafiek bevat die wordt geproduceerd door een grafische toepassing. Met DDE wordt de grafiek gewijzigd wanneer de brongegevens worden gewijzigd, terwijl de rest van het document hetzelfde blijft.
  • Het uitvoeren van gegevensopvragen tussen applicaties, zoals een spreadsheet die een query uitvoert op een database voor achterstallige rekeningen.

Dynamische gegevensuitwisseling vanuit het oogpunt van de gebruiker

In het volgende voorbeeld ziet u hoe twee DDE-toepassingen kunnen samenwerken, zoals te zien is vanuit het oogpunt van de gebruiker.

Een spreadsheetgebruiker wil Microsoft Excel gebruiken om de prijs van een bepaald aandeel op de Beurs van New York bij te houden. De gebruiker heeft een toepassing genaamd Quote die op zijn beurt toegang heeft tot NYSE-gegevens. Het DDE-gesprek tussen Excel en Quote vindt als volgt plaats:

  • De gebruiker start het gesprek door de naam van de toepassing (Quote) op te geven die de gegevens en het specifieke onderwerp van belang (NYSE) levert. Het resulterende DDE-gesprek wordt gebruikt om offertes op specifieke aandelen aan te vragen.
  • In Excel worden de toepassings- en onderwerpnamen uitgezonden naar alle DDE-toepassingen die momenteel in het systeem worden uitgevoerd. Quote reageert, waarbij een gesprek met Excel wordt gevoerd over het NYSE-onderwerp.
  • De gebruiker kan vervolgens een spreadsheetformule maken in een cel waarin wordt aangevraagd dat het werkblad automatisch wordt bijgewerkt wanneer een bepaalde aandelenaanhaling wordt gewijzigd. De gebruiker kan bijvoorbeeld een automatische update aanvragen wanneer er een wijziging optreedt in de verkoopprijs van ZAXX-aandelen door de volgende Excel-formule op te geven: ='Quote'|' NYSE'! ZAXX
  • De gebruiker kan het automatisch bijwerken van de ZAXX aandelenkoers beëindigen op elk gewenst moment. Andere gegevenskoppelingen die afzonderlijk tot stand zijn gebracht (zoals voor offertes voor andere aandelen) blijven actief onder hetzelfde NYSE-gesprek.
  • De gebruiker kan ook het hele gesprek tussen Excel en Quote op het NYSE-onderwerp beëindigen, zodat er geen specifieke gegevenskoppelingen voor dat onderwerp tot stand kunnen worden gebracht zonder een nieuw gesprek te starten.

Concepten voor dynamische gegevensuitwisseling

In de volgende secties worden de belangrijke concepten en terminologie uitgelegd die essentieel zijn voor het begrijpen van dynamische gegevensuitwisseling.

Client, server en gesprek

Twee toepassingen die deelnemen aan DDE, worden geacht betrokken te zijn bij een DDE-gesprek. De toepassing die het gesprek start, is de DDE-clienttoepassing; de toepassing die reageert op de client, is de DDE-servertoepassing. Een toepassing kan tegelijkertijd verschillende gesprekken voeren, die fungeren als de client in sommige en als de server in andere.

Een DDE-gesprek vindt plaats tussen twee vensters, één voor elk van de deelnemende toepassingen. Een venster kan het hoofdvenster van de toepassing zijn; een venster dat is gekoppeld aan een specifiek document, zoals in een MDI-toepassing (multiple-document interface; of een verborgen (onzichtbaar) venster waarvan het enige doel is om DDE-berichten te verwerken.

Aangezien een DDE-gesprek wordt geïdentificeerd door het paar ingangen voor de vensters die in het gesprek zijn betrokken, mag er geen venster worden gebruikt in meer dan één gesprek met een ander venster. De clienttoepassing of de servertoepassing moet een ander venster bieden voor elk van de gesprekken met een bepaalde server of clienttoepassing.

Een toepassing kan ervoor zorgen dat een paar client- en servervensters nooit bij meer dan één gesprek betrokken raakt door voor elk gesprek een verborgen venster te maken. Het enige doel van dit venster is het verwerken van DDE-berichten.

Namen van toepassingen, onderwerpen en items

Het DDE-protocol identificeert de gegevenseenheden die worden doorgegeven tussen de client en server met een hiërarchie van drie niveaus van toepassings-, onderwerp- en itemnamen.

Elk DDE-gesprek wordt uniek gedefinieerd door de naam en het onderwerp van de toepassing. Aan het begin van een DDE-gesprek bepalen de client en server de naam en het onderwerp van de toepassing. De naam van de toepassing is meestal de naam van de servertoepassing. Wanneer Excel bijvoorbeeld fungeert als de server in een gesprek, is de naam van de toepassing Excel.

Het DDE-onderwerp is een algemene classificatie van gegevens waarin meerdere gegevensitems tijdens het gesprek kunnen worden 'besproken' (uitgewisseld). Voor toepassingen die op bestanden gebaseerde documenten werken, is het onderwerp meestal een bestandsnaam. Voor andere toepassingen is het onderwerp een toepassingsspecifieke naam.

Omdat het client- en servervenster samen een DDE-gesprek identificeert, kunnen de naam en het onderwerp van de toepassing die een gesprek definiëren, niet worden gewijzigd tijdens het gesprek.

Een DDE-gegevensitem is informatie met betrekking tot het gespreksonderwerp dat tussen de toepassingen is uitgewisseld. Waarden voor het gegevensitem kunnen worden doorgegeven van de server aan de client of van de client naar de server. Gegevens kunnen worden doorgegeven met een van de standaard klembordindelingen of met een geregistreerde klembordindeling. Een speciale, geregistreerde indeling met de naam Link identificeert een item in een DDE-gesprek. Voor meer informatie over klembordformaten, zie Klembord.

Het systeemonderwerp

Toepassingen moeten het systeemonderwerp altijd ondersteunen. Dit onderwerp bevat een context voor informatie die voor een andere toepassing van algemeen belang kan zijn.

Gegevensitemwaarden moeten worden weergegeven in de CF_TEXT klembordformaat. Afzonderlijke elementen van itemwaarden voor een systeemonderwerp moeten worden gescheiden door tabtekens. In de volgende tabel worden enkele items voor het systeemonderwerp voorgesteld.

Artikel Beschrijving
Formaten Door tabs gescheiden lijst met klembordindelingen die de toepassing kan weergeven. Normaal gesproken worden CF_ indelingen weergegeven met het gedeelte 'CF_' van de namen verwijderd (CF_TEXT wordt bijvoorbeeld weergegeven als "TEKST").
Help Tekst waarin kort wordt uitgelegd hoe u de DDE-server gebruikt.
Retourbericht Ondersteunend detail voor het laatst gebruikte WM_DDE_ACK bericht. Dit item is handig wanneer meer dan acht bits aan toepassingsspecifieke retourgegevens vereist zijn.
Status Indicatie van de huidige status van de toepassing. Wanneer een server een WM_DDE_REQUEST bericht ontvangt voor dit systeemonderwerp, moet deze reageren door een WM_DDE_DATA bericht te plaatsen met een tekenreeks die 'bezet' of 'gereed' bevat, indien van toepassing.
SysItems Lijst met systeemonderwerpitems die door de toepassing worden ondersteund.
OnderwerpItemLijst Net als bij het SysItems-item, behalve dat TopicItemList moet worden ondersteund voor elk ander onderwerp dan het systeemonderwerp. Hierdoor kunt u bladeren door de items die worden ondersteund onder elk onderwerp. Als de items niet kunnen worden geïnventariseerd, mag dit item alleen 'TopicItemList' bevatten.
Onderwerpen Lijst met onderwerpen die de toepassing momenteel ondersteunt; deze lijst kan variëren van moment tot moment.

 

Zodra een DDE-gesprek is gestart, kan de client een of meer permanente gegevenskoppelingen met de server tot stand brengen. Een gegevenskoppeling is een communicatiemechanisme waarmee de server de client op de hoogte stelt wanneer de waarde van een opgegeven gegevensitem wordt gewijzigd. De gegevenskoppeling is permanent in de zin dat dit meldingsproces wordt voortgezet totdat de gegevenskoppeling of het DDE-gesprek zelf wordt beëindigd.

Er zijn twee soorten permanente DDE-gegevenskoppelingen: warm en heet. In een warme gegevenskoppeling meldt de server de client dat de waarde van het gegevensitem is gewijzigd, maar de server verzendt de gegevenswaarde pas naar de client als de client deze aanvraagt. In een dynamische gegevenskoppeling verzendt de server onmiddellijk de gewijzigde gegevenswaarde naar de client.

Applicaties die ondersteuning bieden voor warme of hete gegevensverbindingen, bieden doorgaans een opdracht Kopiëren of Koppeling plakken aan in hun Bewerken-menu om de gebruiker in staat te stellen verbindingen tussen applicaties tot stand te brengen.

Atomen en gedeelde geheugenobjecten

Bepaalde argumenten van DDE-berichten zijn globale atomen of gedeelde geheugenobjecten. Toepassingen die deze argumenten gebruiken, moeten expliciete regels volgen over wanneer ze moeten worden toegewezen en verwijderd. In alle gevallen moet de afzender van het bericht een atoom- of gedeeld geheugenobject verwijderen dat de beoogde ontvanger niet ontvangt vanwege een foutvoorwaarde, zoals het mislukken van de functie PostMessage-.

DDE maakt gebruik van gedeelde geheugenobjecten voor drie doeleinden:

  • Om een waarde van een gegevensitem te transporteren die moet worden uitgewisseld. Dit is een item waarnaar wordt verwezen door de parameter hData in de berichten WM_DDE_DATA en WM_DDE_POKE.
  • Opties in een bericht overbrengen. Dit is een item waarnaar wordt verwezen door de parameter hOptions in een WM_DDE_ADVISE bericht.
  • Een opdrachtuitvoeringsreeks uitvoeren. Dit is een item waarnaar wordt verwezen door de parameter hCommands in het WM_DDE_EXECUTE bericht en het bijbehorende WM_DDE_ACK bericht.

Een toepassing die een gedeeld DDE-geheugenobject ontvangt, moet het als alleen-lezen behandelen. De toepassing mag het object niet gebruiken als een wederzijds lees-/schrijfgebied voor de gratis uitwisseling van gegevens.

Net als bij een DDE-atoom moet een toepassing een gedeeld geheugenobject vrij maken om het geheugen effectief te beheren. De toepassing moet ook geheugenobjecten vergrendelen en ontgrendelen.

Overzicht van dynamische berichten voor gegevensuitwisseling

Omdat DDE een protocol op basis van berichten is, worden er geen functies of bibliotheken gebruikt. Alle DDE-transacties worden uitgevoerd door bepaalde gedefinieerde DDE-berichten door te geven tussen de client- en servervensters.

Er zijn negen DDE-berichten; de symbolische constanten voor deze berichten worden gedefinieerd in het DDE-headerbestand. Bepaalde structuren voor de verschillende DDE-berichten worden ook gedefinieerd in dit headerbestand.

De volgende tabel bevat een overzicht van de DDE-berichten.

Bericht Beschrijving
WM_DDE_ACK Bevestigt dat u een bericht ontvangt of niet ontvangt.
WM_DDE_ADVISE Vraagt de servertoepassing om een update of melding voor een gegevensitem op te geven wanneer het wordt gewijzigd. Hiermee wordt een permanente gegevenskoppeling tot stand gebracht.
WM_DDE_DATA Hiermee wordt een gegevensitemwaarde naar de clienttoepassing verzonden.
WM_DDE_EXECUTE Hiermee wordt een tekenreeks verzonden naar de servertoepassing, die naar verwachting de tekenreeks verwerkt als een reeks opdrachten.
WM_DDE_INITIATE Start een gesprek tussen de client- en servertoepassingen.
WM_DDE_POKE Hiermee wordt een gegevensitemwaarde naar de servertoepassing verzonden.
WM_DDE_REQUEST Vraagt de servertoepassing om de waarde van een gegevensitem op te geven.
WM_DDE_TERMINATE Hiermee wordt een gesprek beëindigd.
WM_DDE_UNADVISE Hiermee wordt een permanente gegevenskoppeling beëindigd.

 

Een toepassing roept SendMessage- aan om het WM_DDE_INITIATE bericht of een WM_DDE_ACK bericht uit te geven dat wordt verzonden als reactie op WM_DDE_INITIATE. Alle andere berichten worden verzonden door PostMessage-. De eerste parameter van deze aanroepen is een ingang voor het ontvangende venster; de tweede parameter bevat het bericht dat moet worden verzonden; de derde parameter identificeert het verzendvenster; en de vierde parameter bevat de berichtspecifieke argumenten.

Dynamische berichtenstroom voor gegevensuitwisseling

Een typisch DDE-gesprek bestaat uit de volgende gebeurtenissen:

  1. De clienttoepassing start het gesprek en de servertoepassing reageert.

  2. De toepassingen wisselen gegevens uit op een of meer van de volgende methoden:

      • De servertoepassing verzendt gegevens naar de client op verzoek van de client.
      • De clienttoepassing verzendt ongevraagde gegevens naar de servertoepassing.
      • De clienttoepassing vraagt de servertoepassing om de client op de hoogte te stellen wanneer een gegevensitem wordt gewijzigd (warme gegevenskoppeling).
      • De client-applicatie vraagt de server-applicatie om gegevens te verzenden telkens wanneer de gegevens wijzigen (hot data link).
      • De servertoepassing voert een opdracht uit op de aanvraag van de client.
  3. De client- of servertoepassing beëindigt het gesprek.

Een toepassingsvenster dat aanvragen van een client of server verwerkt, moet deze strikt verwerken in de volgorde waarin ze worden ontvangen.

Een client kan gesprekken tot stand brengen met meer dan één server; een server kan gesprekken voeren met meer dan één client. Bij het verwerken van berichten van meer dan één bron moet een client of server de berichten van een gesprek synchroon verwerken, maar niet alle berichten synchroon verwerken. Met andere woorden, het kan naar behoefte van het ene gesprek naar het andere worden verplaatst.

Als een toepassing een binnenkomende aanvraag niet kan verwerken omdat deze wacht op een DDE-antwoord, moet deze een impasse voorkomen door een WM_DDE_ACK bericht te plaatsen met het fBusy- lid van de DDEACK- structuur ingesteld op 1. Een toepassing kan ook een bezet WM_DDE_ACK bericht verzenden als een binnenkomende aanvraag om welke reden dan ook niet binnen een redelijke tijd kan worden verwerkt.

Een toepassing moet in staat zijn om ermee om te gaan wanneer een client of server niet binnen een bepaalde tijd op een bericht reageert. Aangezien het time-outinterval kan variëren, afhankelijk van de aard van de toepassing en de configuratie van het systeem van de gebruiker (inclusief of het is verbonden met een netwerk), moet de toepassing een manier bieden voor de gebruiker om het interval op te geven.

Functies voor het verpakken van parameters

De parameter lParam van veel DDE-berichten bevat twee stukjes gegevens. De lParam- van het WM_DDE_DATA bericht bevat bijvoorbeeld een gegevensgreep en een atoom. Toepassingen moeten de functie PackDDElParam gebruiken om de hendel en het atoom in te pakken in een parameter lParam en de functie UnpackDDElParam om de waarden uit te pakken. DDE-toepassingen moeten gebruikmaken van PackDDElParam- en UnpackDDElParam voor alle berichten die zijn gepost tijdens een DDE-gesprek.

Toepassingen kunnen ook gebruikmaken van de functies ReuseDDElParam en FreeDDElParam. ReuseDDElParam stelt een DDE-toepassing in staat om een ingepakte parameter lParam opnieuw te gebruiken, waardoor het aantal hertoewijzingen van geheugen dat de toepassing moet uitvoeren tijdens een gesprek kan verminderen. Een toepassing kan FreeDDElParam- gebruiken om het geheugen dat is gekoppeld aan een gegevensgreep die tijdens een DDE-gesprek is ontvangen, vrij te maken.

Dynamische gegevensuitwisseling en imitatie

Als u een server wilt toestaan een client te imiteren, roept de client de DdeSetQualityOfService--functie aan. De SECURITY_IMPERSONATION_LEVEL structuur wordt gebruikt om het niveau van imitatie te bepalen dat de server kan uitvoeren.

Een DDE-server kan een DDE-client imiteren door de functie ImpersonateDdeClientWindow aan te roepen. Een DDEML-server moet de DdeImpersonateClient functie gebruiken.