2011-08-18 52 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世纪的古代遗留代码。你为什么要写新的代码呢? –

相关问题