7. Überblick DDE

DDE ist die Abkürzung für Dynamic Data Exchange (Dynamischer Datenaustausch). DDE ist ein Verfahren um Daten zwischen Programmen auszutauschen und Kommandos in anderen Programmme auszuführen, andere Programme also „fern zu steuern“. Dabei können mit Hilfe des Netzwerk-DDEs sogar Programme auf anderen Rechnern im Netzwerk gesteuert werden. Beispiele für den Einsatz von DDE sind das Abfragen einer Datenbank oder das Konvertieren von Daten in andere Formate. Bei der Verbindung (Konversation) zweier Programme über DDE unterscheidet man die Client-Seite und die Server-Seite. Der Client ist das Programm, das die Konversation einleitet, das Programm das einen Service leistet ist der Server. UniPlot kann sowohl Server sein als auch Client. Beispielsweise kann ein einfaches Messwerterfassungssystem die Möglichkeiten der Diagrammausgabe von UniPlot verwenden (UniPlot als Server) und UniPlot verwendet dabei gleichzeitig einen anderen Server zur Datenkonvertierung (UniPlot als Client).

7.1. UniPlot als Client

Das Programm das eine DDE-Konversation einleitet wird als Client bezeichnet. UniScript stellt dazu die folgenden sechs Funktionen zur Verfügung.

  DDE-Client
DdeInitiate DdeInitiate leitet eine DDE-Konversation zwischen UniPlot (Client) und einer anderen Anwendung (Server) ein.
DdeExecute DdeExecute führt ein Makro im Server aus.
DdePoke DdePoke sendet Daten an einen Server.
DdeRequest DdeRequest erfragt Daten von einem Server.
DdeAdvise DdeAdvise startet oder beendet einen DDE Nachrichtenschleife (Hot-Link). Aufforderung an den Server, den Client bei Datenänderung zu informieren.
DdeTerminate DdeTerminate schließt einen durch DdeInitiate geöffneten DDE-Kanal.
DdeTerminateAll DdeTerminateAll schließt alle offenen DDE-Kanäle.

Beispiel

Wir wollen UniPlot als Client an einem Beispiel betrachten:

system("c:/msoffice/excel/excel.exe", SW_HIDE, 1);
hConv = DdeInitiate("Excel", "System");
ssFile = GetRootDirectory() + "samples\map-data.xls";
DdeExecute(hConv, "[OPEN(\"" + ssFile + "\")]")
hConvTab = DdeInitiate("Excel", "map-data.xls");
ssData = DdeRequest(hConvTab, "z1s1:z16384s255");
DdeExecute(hConv, "[QUIT()]");
DdeTerminateAll();
hedit = EdCreate();
EdSetText(hedit, ssData);

Wenn Sie diese Zeilen in einen Editor eingeben, werden folgende Aktionen durchgeführt:

  • Das Tabellenkalkulationsprogramm Excel wird gestartet.
  • Excel lädt die Datei Samples\map-data.xls aus dem UniPlot-Verzeichnis.
  • Excel überträgt den Inhalt der Tabelle in eine UniPlot-Variable.
  • Der Inhalt der Tabelle wird in einem UniPlot-Editor angezeigt.

Es soll nicht näher auf das Skript eingegangen werden, schauen Sie sich die Beschreibungen der verwendeten Funktionen an.

7.2. UniPlot als Server

UniPlot kann auch als Server verwendet werden. Dazu stehen die folgenden sechs Funktionen zur Verfügung, die der Anwender von UniScript selbst schreiben muss.

  DDE-Server
DdeCallback_Connect Die Funktion DdeCallback_Connect wird aufgerufen, wenn ein Client einen Kanal zu UniScript öffnet.
DdeCallback_ConnectConfirm Die DdeCallback_ConnectConfirm Funktion wird direkt hinter der DdeCallback_Connect-Funktion aufgerufen.
DdeCallback_Execute Die DdeCallback_Execute Funktion wird vom Client aufgerufen, wenn ein Kommando in UniScript ausgeführt werden soll.
DdeCallback_Poke Die DdeCallback_Poke Funktion wird vom Client aufgerufen um Daten an UniScript zu senden.
DdeCallback_Request Die DdeCallback_Request Funktion wird vom Client aufgerufen um Daten von UniPlot zu erfragen.
DdeCallback_Advise Die DdeCallback_Advise Funktion wird vom Server aufgerufen um Daten an UniScript zu senden.
DdeCallback_Disconnect Die Funktion DdeCallback_Disconnect wird aufgerufen, wenn der Client die Konversation schließt.

Beispiel

Als Beispiel soll ein Basic-Programm in dem Textverarbeitungsprogramm Word geschrieben werden. Das Basic-Programm soll mit Hilfe von UniPlot ein Diagramm erzeugen.

Beginnen wir jedoch zunächst mit der UniPlot-Seite (der Server-Seite). Geben Sie das folgende Programm in einem UniPlot-Editor ein und übersetzen Sie das Programm, indem Sie den Menü-Befehl UniScript=>Speichern/Ausführen auswählen.

def DdeCallback_Poke(hConv, ssItem, ssTopic, ssData)
{
    ss = strtok(ssData, ",")
    rvData = strtod(ss)
    plot(1:len(rvData), rvData);
    return TRUE;
}

Aus Gründen der Übersichtlichkeit, sind hier keine Fehlerkontrollen durchgeführt worden, d.h. die Argumente der Parameter hConv, ssItem, ssTopic werden einfach ignoriert.

Betrachten wir nun die Client-Seite. Wir starten dazu Word und geben das folgende Makro ein (Befehl: Extras=>Makro=>Makro erstellen):

Sub Main
    chan = DDEInitiate("UniPlotSL", "xydata")
    DDEPoke chan, "xydata", "1, 5, 3, 4, 8, 12"
    DDETerminate(chan)
End Sub

Wenn Sie nun die Basic-Funktion Main in Word ausführen, wird ein Diagramm in UniPlot erzeugt.

id-1535155