DdeInitiate

DdeInitiate leitet eine DDE-Konversation zwischen UniPlot (Client) und einer anderen Anwendung (Server) ein.

hConv = DdeInitiate(ssService, ssTopic)

Returnwert

hConv ist die Kanalnummer (Handle) mit der die weitere Konversation durchgeführt werden kann. Im Fehlerfall liefert DdeInitiate den Wert 0.

Parameter

ssService

ssService ist ein Service-Name. Normalerweise ist ssService der Name einer Exe-Datei ohne die Dateinamenserweiterung. Für UniPlot ist der Service-Name "UniPlotSL".

ssTopic

ssTopic ist das Thema der Konversation. Bei den meisten Anwendungen sind Dokument-Namen zulässige Themen. Die meisten Anwendungen unterstützen außerdem das Thema "System".

Kommentar

Mit der Funktion ObjShow kann eine Liste aller geöffneten DDE-Kanäle angezeigt werden.

Falls beim ersten Zugriff der Aufbau der DDE-Verbindung fehl schlägt, versucht die Funktion innerhalb von 500 ms die Verbindung herzustellen.

Beispiel

Die folgende DDE-Konversation startet Excel und fügt die Zahlen 1, 2, 3 und 4 in eine Excel-Tabelle ein.

Zunächst wird Excel mit der Funktion system gestartet. Die 0 des dritten Parameters bewirkt, daß die system Funktion sofort nach dem Aufruf zurückkehrt.

def FindApp(ssApp)
{
    RegConnect("HKEY_LOCAL_MACHINE")
    b = RegOpen("Software\Classes\" + ssApp + "\CLSID");
    s = RegGetValue("");
    RegOpen("Software\Classes\CLSID\" + s + "\LocalServer32")
    return RegGetValue("");
}
s = FindApp("Excel.Application");
if (s == "") {
    MessageBoxError("Excel not found");
    return;
}
system(s, SW_SHOW, 0);

Der folgende Aufruf öffnet einen Kanal zum Thema "System".

hConv = DdeInitiate("Excel", "System");

DdeRequest erfragt die System-Themen.

ssTopics = DdeRequest(hConv, "Topics");

Der nächste Aufruf öffnet einen Kanal zum ersten Thema (das erste Excel-Tabellen Blatt).

hConvTable = DdeInitiate("Excel", strtok(ssTopics, "\t")[2]);

Die Funktion DdePoke schreibt die Zahlen 1,2,3,4 in das erste Excel-Tabellen-Blatt. Z1S1:Z2S2 (Zeile/Spalte) ist der Zellbereich in der deutschen Excel Version. In der englischen Version wird der Zellbereich durch R1C1:R2C2 (Row/Column) festgelegt. Die Zahlen einer Zeile müssen durch Tabulator-Zeichen ("\t") getrennt werden, die Zeilen werden durch die Zeichen ("\r\n") getrennt.

DdePoke(hConvTable, "Z1S1:Z2S2", "1\t2\r\n3\t4")

Nach Beendigung der Konversation werden die geöffneten Kanäle geschlossen. Es könnte auch DdeTerminateAll verwendet werden, um alle offenen Känale zu schließen.

DdeTerminate(hConvTable);
DdeTerminate(hConv);

Beispiel

// HKEY_CURRENT_USER\Software\Classes\CLSID\{F0C8D974-51B6-11D0-BE90-008048AA0191}\LocalServer32
def FindUniPlot()
{
    RegConnect("HKEY_CURRENT_USER")
    b = RegOpen("Software\\Classes\\UniPlot.Application\\CLSID");
    s = RegGetValue("");
    RegOpen("Software\\Classes\\CLSID\\" + s + "\\LocalServer32")
    return RegGetValue("");
}


def FindApp(ssApp)
{
    RegConnect("HKEY_LOCAL_MACHINE")
    b = RegOpen("Software\\Classes\\" + ssApp + "\\CLSID");
    s = RegGetValue("");
    RegOpen("Software\\Classes\\CLSID\\" + s + "\\LocalServer32")
    return RegGetValue("");
}

def test_DdeExecute()
{
    s = FindApp("Excel.Application");
    if (s == "") {
        MessageBoxError("Excel not found");
        return;
    }
    system(s, SW_HIDE, 0);
    hConv = DdeInitiate("Excel", "System");
    DdeExecute(hConv, "[OPEN(\"" + GetRootDirectory() + "samples\\map-data.xls\")]")
    hconvTab = DdeInitiate("Excel", "map-data.xls");
    ssData = DdeRequest(hconvTab, "z1s1:z16384s255");
    ssData = strfindreplace(ssData, ",", ".");
    DdeExecute(hConv, "[CLOSE()]");
    DdeExecute(hConv, "[QUIT()]");
    DdeTerminateAll();

    hedit = EdCreate();
    EdSetText(hedit, ssData);
}

test_DdeExecute();

id-1361586