2011-08-18 55 views
2

我有一個DDE客戶端應用程序,它通過使用SendMessage() WINAPI連接到DDE服務器應用程序。在請求連接到DDE服務器時掛起的SendMessage()呼叫掛起。 DDE客戶端應用程序和服務器應用程序都在VC++中。SendMessage()當用於連接到DDE服務器時,WINAPI獲取掛起

SendMessage((HWND) -1,WM_DDE_INITIATE,(WPARAM) m_hWnd,MAKELPARAM(hService,hTopic)); 

現在SendMessage()在做什麼,它正在被絞死?基本上,它將廣播WM_DDE_INITIATE窗口消息到系統中的所有窗口。它所針對的窗口(DDE服務器)應處理該消息,並應回覆確認。一旦收到確認,SendMessage()呼叫完成並且客戶端已連接。

在我們的案例中,它越來越多,並且永遠不會返回,因此我們有DDE Client應用程序掛起。

我在網上搜索,發現使用SendMessage()廣播通常不建議,因爲它掛起很多次。

我有我的DDE客戶端應用程序和DDE服務器應用程序的代碼。

讓我知道是否有某種方式來檢索DDE服務器窗口句柄或某種方式分配一個唯一的名稱到DDE服務器窗口。

通過這樣做,我相信在客戶端,我可以檢索唯一的名稱DDE服務器的窗口句柄(使用FindWindow() WINAPI)和而不是使用SendMessage()廣播我可以將消息直接使用窗口句柄發送到DDE服務器。

如果您覺得以上方法獲取DDE服務器的窗口句柄是不可能的或不推薦的,那麼請讓我知道一些其他方法使用SendMessage() winapi連接到DDE服務器。

+0

使用EnumWindows而不是FindWindow,所以你將有更好的識別正確窗口的機率。使用Spy ++查看窗口屬性,類名往往適合過濾。 GetClassName()。 DDE是可怕的順便說一句。 –

回答

0

使用SendMessageTimeout代替SendMessage,因此掛起的應用程序不會掛住你。

2

如果另一個進程的任何進程正在其UI線程中休眠並且未處理消息,則返回broadcast messages will hang。還有另一個原因stop using DDE;這是16位Windows when broadcast messages were perfectly safe的剩餘時間。

不幸的是,這是DDE中的一個基本問題。推薦的解決方法是簡單地不使用DDE;使用更現代的方法,如named pipes,DCOM,甚至是TCP套接字。

+0

感謝您的回覆。我知道你說的是什麼,但是有沒有其他的方法可以使用SendMessage連接到DDE服務器winapi – decisive

+0

如果你知道目標窗口的HWND,你可以直接發送消息到那個特定的窗口。儘管如此,我不會推薦這種方法。問題仍然是,您需要以某種方式查找HWND,而現代技術(如命名管道或DCOM)無論如何傾向於更好地工作。 – bdonlan

+0

DDE僅適用於20世紀的古代遺留代碼。你爲什麼要寫新的代碼呢? –

相關問題