C# Win Api DDE连接多线程
C# Win Api DDE connection multithread
我在 C# 中使用 Win Api 实现了 DDE 客户端的功能。如果我在单线程中调用 DdeInitializeW
和 DdeConnect
,一切正常。
具体来说,这些是包装器定义:
[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
);
如果我在不同的线程中调用 DdeInitializeW
和 DdeConnect
,DdeConnect
return 空指针。
此外,如果我在一个线程中同时调用它们(建立 DDE 连接),则无法在另一个线程中使用此 DDE 通道(我收到 INVALIDPARAMETER
DDE 错误)。
正如我所说,在单线程中一切正常。
您描述的行为是正常的。
DDE 绑定到单个线程。这是因为 DDE(通常被认为是遗留技术)通过传递 windows 消息在内部工作,并且 windows 句柄 (HWND
) 具有线程关联性。
- 您必须从调用
DdeConnect
的同一线程调用 DdeInitializeW
。
- 该线程必须发送消息(因此它不能是线程池线程)。
- 你也会在同一个线程上得到 callbacks/replies。
换句话说,您需要从调用 Application.Run
或在适合发送或接收事件的时刻频繁调用 Application.DoEvents
的线程执行 DDE。
您可以在多个线程中使用 DDE,但每个线程都必须调用 DdeInitializeW
并且始终会在发送请求的线程上接收回复。
我在 C# 中使用 Win Api 实现了 DDE 客户端的功能。如果我在单线程中调用 DdeInitializeW
和 DdeConnect
,一切正常。
具体来说,这些是包装器定义:
[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
);
如果我在不同的线程中调用 DdeInitializeW
和 DdeConnect
,DdeConnect
return 空指针。
此外,如果我在一个线程中同时调用它们(建立 DDE 连接),则无法在另一个线程中使用此 DDE 通道(我收到 INVALIDPARAMETER
DDE 错误)。
正如我所说,在单线程中一切正常。
您描述的行为是正常的。
DDE 绑定到单个线程。这是因为 DDE(通常被认为是遗留技术)通过传递 windows 消息在内部工作,并且 windows 句柄 (HWND
) 具有线程关联性。
- 您必须从调用
DdeConnect
的同一线程调用DdeInitializeW
。 - 该线程必须发送消息(因此它不能是线程池线程)。
- 你也会在同一个线程上得到 callbacks/replies。
换句话说,您需要从调用 Application.Run
或在适合发送或接收事件的时刻频繁调用 Application.DoEvents
的线程执行 DDE。
您可以在多个线程中使用 DDE,但每个线程都必须调用 DdeInitializeW
并且始终会在发送请求的线程上接收回复。