C# Win Api DDE连接多线程

C# Win Api DDE connection multithread

我在 C# 中使用 Win Api 实现了 DDE 客户端的功能。如果我在单线程中调用 DdeInitializeWDdeConnect,一切正常。 具体来说,这些是包装器定义:

    [DllImport("user32.dll")]
    protected static extern int DdeInitializeW(ref int id, DDECallback cb, int afcmd, int ulres);

    [DllImport("user32.dll")]
    static extern IntPtr DdeConnect(
        int idInst,             // instance identifier
        IntPtr hszService,      // handle to service name string
        IntPtr hszTopic,        // handle to topic name string
        IntPtr pCC              // context data
        );

如果我在不同的线程中调用 DdeInitializeWDdeConnectDdeConnect return 空指针。

此外,如果我在一个线程中同时调用它们(建立 DDE 连接),则无法在另一个线程中使用此 DDE 通道(我收到 INVALIDPARAMETER DDE 错误)。

正如我所说,在单线程中一切正常。

您描述的行为是正常的。

DDE 绑定到单个线程。这是因为 DDE(通常被认为是遗留技术)通过传递 windows 消息在内部工作,并且 windows 句柄 (HWND) 具有线程关联性。

  • 您必须从调用 DdeConnect 的同一线程调用 DdeInitializeW
  • 该线程必须发送消息(因此它不能是线程池线程)。
  • 你也会在同一个线程上得到 callbacks/replies。

换句话说,您需要从调用 Application.Run 或在适合发送或接收事件的时刻频繁调用 Application.DoEvents 的线程执行 DDE。

您可以在多个线程中使用 DDE,但每个线程都必须调用 DdeInitializeW 并且始终会在发送请求的线程上接收回复。