是否可以使用`TDdeClientConv`类枚举所有可用的DDE服务器?

时间:2017-03-12 07:50:14

标签: delphi vcl dde

我对所有正在运行的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对话的客户端点,因此我的场景超出了范围?

1 个答案:

答案 0 :(得分:2)

TDdeClientConv不使用任何窗口消息,而是使用Dynamic Data Exchange Management Library (DDEML)代替。 TDdeClientConv只能连接到实现指定Service和/或Topic的单个服务器,因为它使用DDEML DdeConnect()函数建立连接:

  

与支持指定服务名称和主题名称对的服务器应用程序建立对话。 如果存在多个此类服务器,则系统仅选择一个

另一方面,DDEML的DdeConnectList()功能可以与支持给定服务和/或主题的多个服务器建立对话。

  

与支持指定服务名称和主题名称对的所有服务器应用程序建立对话。应用程序还可以使用此函数通过将函数传递给现有会话句柄来获取会话句柄列表。动态数据交换管理库从对话列表中删除任何已终止对话的句柄。 生成的会话列表包含支持指定服务名称和主题名称的所有当前建立的会话的句柄。

您可以使用DdeQueryNextServer()DdeQueryConvInfo()函数枚举该列表。