Пример #1
0
        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);
            }
        }
Пример #2
0
            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));
                                    }
                                }
                            }
                        }
                    }
                }));
            }