2017-03-12 77 views
1

我對所有正在運行的DDE服務器感到好奇,試過TDdeClientConv類但感到困惑(可能只是沒有弄清楚如何),最後推出了我自己的低級(通常應用程序應該使用DDEML抽象層)「客戶端「:是否可以使用`TDdeClientConv`類來枚舉所有可用的DDE服務器?

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對話的客戶端,因此我的方案超出了範圍?

回答

2

TDdeClientConv不使用任何窗口消息,而是使用Dynamic Data Exchange Management Library (DDEML)代替。 TDdeClientConv只能連接到一個實現指定的服務和/或主題單個服務器,因爲它確定使用DDEML DdeConnect()功能及其連接:

建立與支持指定服務名和話題的服務器應用程序的對話名字對。 如果存在多個此類服務器,則系統只會選擇一個

另一方面,DDEML的DdeConnectList()功能可以與支持給定服務和/或主題的多個服務器建立對話。

與支持指定服務名稱和主題名稱對的所有服務器應用程序建立對話。應用程序還可以使用此函數通過傳遞現有對話句柄的函數來獲取對話句柄的列表。動態數據交換管理庫從會話列表中刪除任何已終止會話的句柄。 生成的會話列表包含支持指定服務名稱和主題名稱的所有當前建立的會話的句柄。

您可以使用DdeQueryNextServer()DdeQueryConvInfo()函數來枚舉該列表。

相關問題