DdeInitiate leitet eine DDE-Konversation zwischen UniPlot (Client) und einer anderen Anwendung (Server) ein.
Returnwert
hConv ist die Kanalnummer (Handle) mit der die weitere Konversation durchgeführt werden kann. Im Fehlerfall liefert DdeInitiate den Wert 0.
Parameter
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 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()
Siehe auch
Überblick DDE, DdeTerminate, DdeTerminateAll, DdePoke, DdeExecute, DdeRequest
id-1361586