Informationen zum dynamischen Datenaustausch
Windows bietet mehrere Methoden zum Übertragen von Daten zwischen Anwendungen. Eine Methode besteht darin, das DDE-Protokoll (Dynamic Data Exchange) zu verwenden. Das DDE-Protokoll ist eine Reihe von Meldungen und Richtlinien. Es sendet Nachrichten zwischen Anwendungen, die Daten gemeinsam nutzen, und verwendet freigegebenen Arbeitsspeicher, um Daten zwischen Anwendungen auszutauschen. Anwendungen können das DDE-Protokoll für einmalige Datenübertragungen und für kontinuierlichen Austausch verwenden, bei dem Anwendungen Updates aneinander senden, sobald neue Daten verfügbar werden.
Windows unterstützt auch die Dynamic Data Exchange Management Library (DDEML). Die DDEML ist eine DLL (Dynamic Link Library), die Anwendungen zum Freigeben von Daten verwenden können. Die DDEML stellt Funktionen und Meldungen bereit, die das Hinzufügen von DDE-Funktionen zu einer Anwendung vereinfachen. Anstatt DDE-Nachrichten direkt zu senden, zu veröffentlichen und zu verarbeiten, verwendet eine Anwendung die DDEML-Funktionen, um DDE-Unterhaltungen zu verwalten. (Eine DDE-Unterhaltung ist die Interaktion zwischen Client- und Serveranwendungen.)
Die DDEML bietet auch eine Möglichkeit zum Verwalten der Zeichenfolgen und Daten, die DDE-Anwendungen gemeinsam nutzen. Anstatt Atome und Zeiger auf freigegebene Speicherobjekte zu verwenden, erstellen und tauschen DDE-Anwendungen Zeichenfolgenhandles aus, die Zeichenfolgen und Datenhandles identifizieren, die Speicherobjekte identifizieren. Die DDEML ermöglicht es auch einer Serveranwendung, die von ihr unterstützten Dienstnamen zu registrieren. Die Namen werden an andere Anwendungen im System übertragen, die die Namen verwenden können, um eine Verbindung mit dem Server herzustellen. Darüber hinaus stellt die DDEML die Kompatibilität zwischen DDE-Anwendungen sicher, indem sie sie zwingt, das DDE-Protokoll konsistent zu implementieren.
Vorhandene Anwendungen, die das nachrichtenbasierte DDE-Protokoll verwenden, sind vollständig kompatibel mit denen, die die DDEML verwenden. Das heißt, eine Anwendung, die nachrichtenbasierte DDE verwendet, kann Unterhaltungen einrichten und Transaktionen mit Anwendungen durchführen, die die DDEML verwenden. Aufgrund der vielen Vorteile der DDEML sollten neue Anwendungen sie anstelle der DDE-Nachrichten verwenden. Um die API-Elemente der DDEML verwenden zu können, müssen Sie die DDEML-Headerdatei in Ihre Quelldateien einschließen, eine Verknüpfung mit der DDEML-Bibliothek herstellen und sicherstellen, dass sich die Dynamische DDEML-Bibliothek im Suchpfad des Systems befindet.
Die folgenden Themen werden in diesem Abschnitt erläutert.
- Dynamisches Datenaustauschprotokoll
- Verwendung für dynamischen Windows-Datenaustausch
- Dynamischer Datenaustausch aus Sicht des Benutzers
- Konzepte für dynamischen Datenaustausch
- Übersicht über dynamische Datenaustauschnachrichten
- Nachrichtenfluss für dynamischen Datenaustausch
- Parameterverpackungsfunktionen
- Dynamischer Datenaustausch und Identitätswechsel
Dynamisches Datenaustauschprotokoll
Da Windows über eine nachrichtenbasierte Architektur verfügt, ist das Übergeben von Nachrichten die am besten geeignete Methode für die automatische Übertragung von Informationen zwischen Anwendungen. Nachrichten enthalten jedoch nur zwei Parameter (wParam und lParam) zum Übergeben von Daten. Daher müssen sich diese Parameter indirekt auf andere Daten beziehen, wenn mehr als ein paar Wörter von Informationen zwischen Anwendungen übergeben werden. Das DDE-Protokoll definiert genau, wie Anwendungen die Parameter wParam und lParam verwenden sollen, um größere Datenteile mithilfe globaler Atome und gemeinsam genutzter Speicherhandles zu übergeben. Das DDE-Protokoll verfügt über spezifische Regeln zum Zuweisen und Löschen globaler Atome und freigegebener Speicherobjekte.
Ein globales Atom ist ein Verweis auf eine Zeichenfolge. Im DDE-Protokoll identifizieren Atome die Anwendungen, die Daten austauschen, die Art der ausgetauschten Daten und die Datenelemente selbst. Weitere Informationen zu Atomen finden Sie unter Informationen zu Atomen.
Verwendung für dynamischen Windows-Datenaustausch
DDE eignet sich am besten für den Datenaustausch, für den keine fortlaufende Benutzerinteraktion erforderlich ist. In der Regel stellt eine Anwendung eine Methode für den Benutzer bereit, um die Verbindung zwischen den Anwendungen herzustellen, die Daten austauschen. Sobald diese Verbindung hergestellt wurde, tauschen die Anwendungen jedoch Daten ohne weitere Benutzerbeteiligung aus.
DDE kann verwendet werden, um eine breite Palette von Anwendungsfeatures zu implementieren, z. B.:
- Verknüpfung mit Echtzeitdaten, z. B. mit Börsenupdates, wissenschaftlichen Instrumenten oder Prozesssteuerung.
- Erstellen zusammengesetzter Dokumente, z. B. eines Textverarbeitungsdokuments, das ein von einer Grafikanwendung erstelltes Diagramm enthält. Bei Verwendung von DDE ändert sich das Diagramm, wenn die Quelldaten geändert werden, während der Rest des Dokuments unverändert bleibt.
- Ausführen von Datenabfragen zwischen Anwendungen, z. B. ein Arbeitsblatt, das eine Datenbank nach überfälligen Konten abfragt.
Dynamischer Datenaustausch aus Sicht des Benutzers
Das folgende Beispiel veranschaulicht, wie zwei DDE-Anwendungen aus Sicht des Benutzers zusammenarbeiten können.
Ein Tabellenkalkulationsbenutzer möchte Microsoft Excel verwenden, um den Kurs einer bestimmten Aktie an der New Yorker Börse nachzuverfolgen. Der Benutzer verfügt über eine Anwendung namens Quote, die wiederum Zugriff auf NYSE-Daten hat. Die DDE-Konversation zwischen Excel und Quote findet wie folgt statt:
- Der Benutzer initiiert die Konversation, indem er den Namen der Anwendung (Quote) angibt, die die Daten und das jeweilige Thema (NYSE) bereitstellt. Die resultierende DDE-Konversation wird verwendet, um Angebote für bestimmte Aktien anzufordern.
- Excel sendet die Anwendungs- und Themennamen an alle DDE-Anwendungen, die derzeit im System ausgeführt werden. Quote antwortet, um ein Gespräch mit Excel über das THEMA DER NYSE zu erstellen.
- Der Benutzer kann dann eine Tabellenkalkulationsformel in einer Zelle erstellen, die fordert, dass das Arbeitsblatt automatisch aktualisiert wird, wenn sich ein bestimmtes Aktienangebot ändert. Beispielsweise könnte der Benutzer eine automatische Aktualisierung anfordern, wenn eine Änderung des Verkaufspreises der ZAXX-Aktie auftritt, indem er die folgende Excel-Formel angibt: ='Quote'|' NYSE'! ZAXX
- Der Nutzer kann die automatische Aktualisierung des ZAXX-Aktienkurses jederzeit beenden. Andere Datenlinks, die separat eingerichtet wurden (z. B. für Notierungen für andere Aktien), bleiben weiterhin im Rahmen derselben NYSE-Konversation aktiv.
- Der Benutzer kann auch die gesamte Konversation zwischen Excel und Quote zum THEMA NYSE beenden, sodass keine spezifischen Datenlinks zu diesem Thema eingerichtet werden können, ohne eine neue Konversation zu initiieren.
Konzepte für dynamischen Datenaustausch
In den folgenden Abschnitten werden die wichtigen Konzepte und Terminologien erläutert, die für das Verständnis des dynamischen Datenaustauschs von entscheidender Bedeutung sind.
- Client, Server und Unterhaltung
- Anwendungs-, Themen- und Elementnamen
- Das Systemthema
- Permanente Datenlinks
- Atome und Shared Memory-Objekte
Client, Server und Unterhaltung
Zwei an DDE teilnehmende Anwendungen sollen an einem DDE-Gespräch beteiligt sein. Die Anwendung, die die Konversation initiiert, ist die DDE-Clientanwendung. Die Anwendung, die auf den Client antwortet, ist die DDE-Serveranwendung. Eine Anwendung kann gleichzeitig an mehreren Unterhaltungen teilnehmen und in einigen als Client und in anderen als Server fungieren.
Eine DDE-Unterhaltung findet zwischen zwei Fenstern statt, eines für jede der teilnehmenden Anwendungen. Ein Fenster kann das Standard Fenster der Anwendung sein, ein Fenster, das einem bestimmten Dokument zugeordnet ist, wie in einer MDI-Anwendung (Multiple Document Interface) oder ein ausgeblendetes (unsichtbares) Fenster, dessen einziger Zweck darin besteht, DDE-Nachrichten zu verarbeiten.
Da eine DDE-Unterhaltung durch das Paar von Handlen für die Fenster identifiziert wird, die an der Unterhaltung beteiligt sind, sollte kein Fenster an mehr als einer Unterhaltung mit einem anderen Fenster beteiligt sein. Entweder die Clientanwendung oder die Serveranwendung muss für jede Unterhaltung mit einem bestimmten Server oder einer bestimmten Clientanwendung ein anderes Fenster bereitstellen.
Eine Anwendung kann sicherstellen, dass ein Paar von Client- und Serverfenstern nie an mehr als einer Unterhaltung beteiligt ist, indem ein ausgeblendetes Fenster für jede Unterhaltung erstellt wird. Der einzige Zweck dieses Fensters besteht darin, DDE-Nachrichten zu verarbeiten.
Anwendungs-, Themen- und Elementnamen
Das DDE-Protokoll identifiziert die Zwischen client und server übergebenen Dateneinheiten mit einer dreistufigen Hierarchie von Anwendungs-, Themen- und Elementnamen.
Jede DDE-Unterhaltung wird durch den Anwendungsnamen und das Thema eindeutig definiert. Zu Beginn einer DDE-Unterhaltung bestimmen Client und Server den Anwendungsnamen und das Thema. Der Anwendungsname ist in der Regel der Name der Serveranwendung. Wenn Excel beispielsweise als Server in einer Unterhaltung fungiert, lautet der Anwendungsname Excel.
Das DDE-Thema ist eine allgemeine Klassifizierung von Daten, in der mehrere Datenelemente während der Unterhaltung "diskutiert" (ausgetauscht) werden können. Für Anwendungen, die mit dateibasierten Dokumenten arbeiten, ist das Thema in der Regel ein Dateiname. Für andere Anwendungen ist das Thema ein anwendungsspezifischer Name.
Da die Client- und Serverfensterhandles zusammen eine DDE-Unterhaltung identifizieren, können der Anwendungsname und das Thema, die eine Konversation definieren, während der Konversation nicht geändert werden.
Ein DDE-Datenelement sind Informationen im Zusammenhang mit dem Konversationsthema, das zwischen den Anwendungen ausgetauscht wird. Werte für das Datenelement können vom Server an den Client oder vom Client an den Server übergeben werden. Daten können mit einem beliebigen Standardformat der Zwischenablage oder mit einem registrierten Zwischenablageformat übergeben werden. Ein spezielles, registriertes Format namens Link identifiziert ein Element in einer DDE-Unterhaltung. Weitere Informationen zu Zwischenablageformaten finden Sie unter Zwischenablage.
Das Systemthema
Anwendungen sollten das Systemthema jederzeit unterstützen. Dieses Thema enthält einen Kontext für Informationen, die für eine andere Anwendung von allgemeinem Interesse sein können.
Datenelementwerte müssen im CF_TEXT Zwischenablageformat gerendert werden. Einzelne Elemente von Elementwerten für ein Systemthema müssen durch Registerkartenzeichen getrennt werden. Die folgende Tabelle enthält einige Elemente für das Systemthema.
Element | Beschreibung |
---|---|
Formate | Tabulatortrennte Liste der Zwischenablageformate, die die Anwendung rendern kann. In der Regel werden CF_ Formate mit dem "CF_"-Teil der entfernten Namen aufgeführt (z. B. wird CF_TEXT als "TEXT" aufgeführt). |
Hilfe | Text, in dem kurz erläutert wird, wie der DDE-Server verwendet wird. |
Returnmessage | Unterstützende Details für die zuletzt verwendete WM_DDE_ACK Nachricht. Dieses Element ist nützlich, wenn mehr als acht Bits anwendungsspezifischer Rückgabedaten erforderlich sind. |
Status | Angabe der aktuellen status der Anwendung. Wenn ein Server eine WM_DDE_REQUEST Nachricht für dieses Systemthemaelement empfängt, sollte er reagieren, indem er eine WM_DDE_DATA Nachricht mit einer Zeichenfolge mit "Gebucht" oder "Bereit" veröffentlicht. |
SysItems | Liste der von der Anwendung unterstützten Systemthemenelemente. |
TopicItemList | Ähnlich dem SysItems-Element, außer dass TopicItemList für jedes andere Thema als das Systemthema unterstützt werden sollte. Dies ermöglicht das Durchsuchen der elemente, die unter einem beliebigen Thema unterstützt werden. Wenn die Elemente nicht aufgelistet werden können, sollte dieses Element nur "TopicItemList" enthalten. |
Themen | Liste der Themen, die die Anwendung zum aktuellen Zeitpunkt unterstützt; Diese Liste kann von Moment zu Moment variieren. |
Permanente Datenlinks
Sobald eine DDE-Konversation begonnen hat, kann der Client eine oder mehrere dauerhafte Datenverbindungen mit dem Server herstellen. Eine Datenverbindung ist ein Kommunikationsmechanismus, mit dem der Server den Client benachrichtigt, wenn sich der Wert eines angegebenen Datenelements ändert. Die Datenverknüpfung ist in dem Sinne dauerhaft, dass dieser Benachrichtigungsprozess fortgesetzt wird, bis die Datenverknüpfung oder die DDE-Unterhaltung selbst beendet wird.
Es gibt zwei Arten von permanenten DDE-Datenverbindungen: warm und heiß. In einer warmen Datenverbindung benachrichtigt der Server den Client, dass sich der Wert des Datenelements geändert hat, aber der Server sendet den Datenwert erst an den Client, wenn der Client ihn anfordert. In einer hot data link sendet der Server sofort den geänderten Datenwert an den Client.
Anwendungen, die warme oder heiße Datenlinks unterstützen, bieten in der Regel den Befehl Link kopieren oder einfügen im Menü Bearbeiten an, damit benutzer Verknüpfungen zwischen Anwendungen herstellen können.
Atome und Shared Memory-Objekte
Bestimmte Argumente von DDE-Nachrichten sind globale Atome oder freigegebene Speicherobjekte. Anwendungen, die diese Argumente verwenden, müssen explizite Regeln befolgen, wann sie zugeordnet und gelöscht werden sollen. In allen Fällen muss der Nachrichtensender jedes Atom- oder Freigegebene Speicherobjekt löschen, das der beabsichtigte Empfänger aufgrund einer Fehlerbedingung nicht empfängt, z. B. ein Fehler der PostMessage-Funktion .
DDE verwendet Shared Memory-Objekte für drei Zwecke:
- Um einen zu tauschenden Datenelementwert zu tragen. Dies ist ein Element, auf das vom hData-Parameter in den WM_DDE_DATA - und WM_DDE_POKE meldungen verwiesen wird.
- So tragen Sie Optionen in einer Nachricht. Dies ist ein Element, auf das vom hOptions-Parameter in einer WM_DDE_ADVISE-Nachricht verwiesen wird.
- Um eine Befehlsausführungszeichenfolge zu tragen. Dies ist ein Element, auf das vom hCommands-Parameter in der WM_DDE_EXECUTE Nachricht und der entsprechenden WM_DDE_ACK Nachricht verwiesen wird.
Eine Anwendung, die ein DDE-Shared Memory-Objekt empfängt, muss es als schreibgeschützt behandeln. Die Anwendung darf das Objekt nicht als gegenseitigen Lese-/Schreibbereich für den freien Datenaustausch verwenden.
Wie bei einem DDE-Atom sollte eine Anwendung ein Freigegebenes Speicherobjekt freigeben, um den Arbeitsspeicher effektiv zu verwalten. Die Anwendung sollte auch Speicherobjekte sperren und entsperren.
Übersicht über dynamische Datenaustauschnachrichten
Da DDE ein nachrichtenbasiertes Protokoll ist, werden keine Funktionen oder Bibliotheken verwendet. Alle DDE-Transaktionen werden durchgeführt, indem bestimmte definierte DDE-Nachrichten zwischen den Client- und Serverfenstern übergeben werden.
Es gibt neun DDE-Nachrichten; Die symbolischen Konstanten für diese Nachrichten werden in der DDE-Headerdatei definiert. Bestimmte Strukturen für die verschiedenen DDE-Nachrichten sind auch in dieser Headerdatei definiert.
In der folgenden Tabelle sind die DDE-Nachrichten zusammengefasst.
`Message` | BESCHREIBUNG |
---|---|
WM_DDE_ACK | Bestätigt, dass eine Nachricht empfangen oder nicht empfangen wird. |
WM_DDE_ADVISE | Fordert die Serveranwendung auf, bei jeder Änderung ein Update oder eine Benachrichtigung für ein Datenelement bereitzustellen. Dadurch wird eine permanente Datenverbindung hergestellt. |
WM_DDE_DATA | Sendet einen Datenelementwert an die Clientanwendung. |
WM_DDE_EXECUTE | Sendet eine Zeichenfolge an die Serveranwendung, die die Zeichenfolge als Eine Reihe von Befehlen verarbeiten soll. |
WM_DDE_INITIATE | Initiiert eine Konversation zwischen client- und Serveranwendungen. |
WM_DDE_POKE | Sendet einen Datenelementwert an die Serveranwendung. |
WM_DDE_REQUEST | Fordert die Serveranwendung an, den Wert eines Datenelements bereitzustellen. |
WM_DDE_TERMINATE | Beendet eine Unterhaltung. |
WM_DDE_UNADVISE | Beendet eine permanente Datenverbindung. |
Eine Anwendung ruft SendMessage auf, um die WM_DDE_INITIATE Nachricht oder eine WM_DDE_ACK Nachricht auszugeben, die als Antwort auf WM_DDE_INITIATE gesendet wurde. Alle anderen Nachrichten werden von PostMessage gesendet. Der erste Parameter dieser Aufrufe ist ein Handle für das empfangende Fenster. der zweite Parameter enthält die zu sendende Nachricht. der dritte Parameter identifiziert das Sendefenster; und der vierte Parameter enthält die nachrichtenspezifischen Argumente.
Nachrichtenfluss für dynamischen Datenaustausch
Eine typische DDE-Unterhaltung besteht aus den folgenden Ereignissen:
Die Clientanwendung initiiert die Konversation, und die Serveranwendung antwortet.
Die Anwendungen tauschen Daten mit einer oder allen der folgenden Methoden aus:
-
- Die Serveranwendung sendet auf Anforderung des Clients Daten an den Client.
- Die Clientanwendung sendet nicht angeforderte Daten an die Serveranwendung.
- Die Clientanwendung fordert die Serveranwendung auf, den Client zu benachrichtigen, wenn sich ein Datenelement ändert (warmer Datenlink).
- Die Clientanwendung fordert die Serveranwendung auf, Daten zu senden, wenn sich die Daten ändern (Hot Data Link).
- Die Serveranwendung führt auf Anforderung des Clients einen Befehl aus.
-
Entweder der Client oder die Serveranwendung beendet die Konversation.
Ein Anwendungsfenster, das Anforderungen von einem Client oder Server verarbeitet, muss diese streng in der Reihenfolge verarbeiten, in der sie empfangen werden.
Ein Client kann Unterhaltungen mit mehreren Servern herstellen. Ein Server kann Unterhaltungen mit mehr als einem Client führen. Beim Verarbeiten von Nachrichten aus mehreren Quellen muss ein Client oder Server die Nachrichten einer Unterhaltung synchron verarbeiten, muss aber nicht alle Nachrichten synchron verarbeiten. Mit anderen Worten, es kann nach Bedarf von einer Unterhaltung in eine andere verschoben werden.
Wenn eine Anwendung eine eingehende Anforderung nicht verarbeiten kann, weil sie auf eine DDE-Antwort wartet, muss sie einen Deadlock verhindern, indem sie eine WM_DDE_ACK Nachricht mit dem fBusy-Member der DDEACK-Struktur auf 1 veröffentlicht. Eine Anwendung kann auch eine ausgelastete WM_DDE_ACK-Nachricht senden, wenn sie aus irgendeinem Grund eine eingehende Anforderung nicht innerhalb einer angemessenen Zeit verarbeiten kann.
Eine Anwendung sollte in der Lage sein, den Fehler eines Clients oder Servers zu behandeln, um innerhalb einer bestimmten Zeit auf eine Nachricht zu reagieren. Da das Timeoutintervall abhängig von der Art der Anwendung und der Konfiguration des Systems des Benutzers (einschließlich der Verbindung mit einem Netzwerk) variieren kann, sollte die Anwendung dem Benutzer eine Möglichkeit bieten, das Intervall anzugeben.
Parameterverpackungsfunktionen
Der lParam-Parameter vieler DDE-Nachrichten enthält zwei Daten. Beispielsweise enthält die lParam der WM_DDE_DATA Nachricht ein Datenhandle und ein Atom. Anwendungen müssen die PackDDElParam-Funktion verwenden, um den Handle und das Atom in einen lParam-Parameter zu packen, und die UnpackDDElParam-Funktion , um die Werte zu entfernen. DDE-Anwendungen müssen PackDDElParam und UnpackDDElParam für alle Nachrichten verwenden, die während einer DDE-Unterhaltung veröffentlicht werden.
Anwendungen können auch die Funktionen ReuseDElParam und FreeDDElParam verwenden. ReuseDDElParam ermöglicht es einer DDE-Anwendung, einen gepackten lParam-Parameter wiederzuverwenden, wodurch die Anzahl der Speicherumlagerungen verringert wird, die die Anwendung während einer Unterhaltung ausführen muss. Eine Anwendung kann FreeDDElParam verwenden, um den Speicher freizugeben, der einem Datenhandle zugeordnet ist, das während einer DDE-Unterhaltung empfangen wurde.
Dynamischer Datenaustausch und Identitätswechsel
Damit ein Server die Identität eines Clients annehmen kann, ruft der Client die DdeSetQualityOfService-Funktion auf. Die SECURITY_IMPERSONATION_LEVEL-Struktur wird verwendet, um die Ebene des Identitätswechsels zu steuern, die der Server möglicherweise ausführt.
Ein DDE-Server kann die Identität eines DDE-Clients annehmen, indem er die Funktion ImpersonateDdeClientWindow aufruft . Ein DDEML-Server sollte die DdeImpersonateClient-Funktion verwenden.