IntPtr DdeCallback(int uType, int uFmt, IntPtr hConv, IntPtr hsz1, IntPtr hsz2, IntPtr hData, IntPtr dwData1, IntPtr dwData2) { string str1 = DDEML.GetString(idInst, hsz1); string str2 = DDEML.GetString(idInst, hsz2); Log.Emit("dde-cb", "uType", DDEML.GetTypeString(uType), "uFmt", uFmt, "hConv", hConv, "hsz1", str1, "hsz2", str2, "hData", hData, "dwData1", dwData1, "dwData2", dwData2); if (hConv == IntPtr.Zero) { return(IntPtr.Zero); } Conversation conversation; if (!conversations.TryGetValue(hConv, out conversation)) { Log.Emit("dde-cb-conv-not-found"); return(IntPtr.Zero); } switch (uType) { case DDEML.XTYP_ADVDATA: { conversation.AdviseReceived(str2); return(new IntPtr(DDEML.DDE_FACK)); } case DDEML.XTYP_XACT_COMPLETE: { conversation.TransactionCompleted(dwData1, str2, hData); return(IntPtr.Zero); } case DDEML.XTYP_DISCONNECT: { conversation.Disconnected(); return(IntPtr.Zero); } default: return(IntPtr.Zero); } }
void Transact(string itemName, int wFmt, int wType, DDETransactionCallback callback) { Client.dispatcher.BeginInvoke(new Action(delegate() { if (Handle == IntPtr.Zero) { return; } int res = 0; using (var hsz = new DdeStringHandle(Client.idInst, itemName)) { using (var hData = new DdeDataHandle(DDEML.DdeClientTransaction(null, 0, Handle, hsz.Handle, wFmt, wType, DDEML.TIMEOUT_ASYNC, ref res))) { Log.Emit("dde-transact", "hConv", this.Handle, "item", itemName, "wFmt", wFmt, "wType", DDEML.GetTypeString(wType), "callback", callback != null, "id", res); if (hData.Handle == IntPtr.Zero) { var errno = DDEML.DdeGetLastError(Client.idInst); Log.Emit("dde-transact-failed", "error", DDEML.GetErrorString(errno) + " (" + errno.ToString() + ")"); if (callback != null) { callback(itemName, false, null); } this.Disconnect(); } else { if (callback != null) { if (res == 0) { callback(itemName, false, null); } else if (callback != null & res != 0) { var id = new IntPtr(res); transactions.Add(id, new Transaction(id, callback)); } } } } } })); }