我对所有运行的DDE服务器都感到好奇,尝试了TDdeClientConv
类,但对此感到困惑(可能只是没有弄清楚如何),最后滚动了自己的低级(通常是通常应用程序应使用DDEML抽象层)"客户端":
procedure TForm6.FormClick(Sender: TObject);
begin
{ initiate DDE conversation with all top-level windows }
SendMessage(
HWND_BROADCAST,
WM_DDE_INITIATE,
Handle,
MakeLParam(
0, // all services
0 // all topics
)
);
end;
procedure TForm6.WMDDE_Ack(var Message: TWMDDE_Ack);
begin
{ this message handler receives acknowledgements }
{ and prints service-topic pairs to console }
Writeln('"' + GetAtom(Message.App) + '"', #9, '"' + GetAtom(Message.Topic) + '"');
end;
问题:是否可以对TDdeClientConv
类进行相同的操作,也就是说,与所有可用服务启动DDE对话并接收多个确认?或TDdeClientConv
仅代表DDE对话的客户端端点,因此我的场景超出了范围?
TDdeClientConv
不使用任何窗口消息,而是使用动态数据交换管理库(ddeml)。TDdeClientConv
只能连接到实现指定服务和/或主题的单个服务器,因为它使用DDEML DdeConnect()
函数建立了其连接:
另一方面,与服务器应用程序建立对话,该对话支持指定的服务名称和主题名称对。如果存在多个这样的服务器,则系统仅选择一个。
ddeml的DdeConnectList()
功能可以与支持给定服务和/或主题的多个服务器建立对话。
与所有支持指定的服务名称和主题名称对的服务器应用程序建立对话。应用程序还可以使用此功能通过传递现有对话句柄的功能来获取对话句柄列表。动态数据交换管理库从对话列表中删除了任何终止对话的操作。结果对话列表包含所有当前建立的对话的处理,这些对话支持指定的服务名称和主题名称。
您可以使用DdeQueryNextServer()
和DdeQueryConvInfo()
函数枚举该列表。