2

我有一个 DDE 客户端应用程序,它使用SendMessage()WINAPI 连接到 DDE 服务器应用程序。在SendMessage()请求连接到 DDE 服务器时挂起的呼叫之后。DDE 客户端应用程序和服务器应用程序都在 VC++ 中。

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

现在SendMessage()它在做什么被绞死了?基本上它是WM_DDE_INITIATE向系统中的所有窗口广播窗口消息。它所针对的窗口(DDE 服务器)应处理该消息并应以确认回复。收到确认后,SendMessage()呼叫完成并连接客户端。

在我们的例子中,它正在挂起并且永远不会返回,因此我们的 DDE 客户端应用程序正在挂起。

我在网上搜索,发现SendMessage()通常不推荐使用广播,因为它会挂很多次。

我有 DDE 客户端应用程序和 DDE 服务器应用程序的代码。

让我知道是否有某种方法可以检索 DDE 服务器窗口句柄或某种方法可以为 DDE 服务器窗口分配一个唯一名称。

通过这样做,我相信在客户端我可以从唯一名称(使用FindWindow()winapi)检索 DDE 服务器的窗口句柄,而不是使用广播,SendMessage()我可以使用窗口句柄将消息直接发送到 DDE 服务器。

如果您觉得上述获取 DDE 服务器窗口句柄的方法不可行或不推荐,那么请告诉我一些其他使用SendMessage()winapi 连接到 DDE 服务器的方法。

4

2 回答 2

2

如果另一个进程,任何进程,正在它们的 UI 线程中休眠并且不处理消息,则广播消息将挂起停止使用 DDE的另一个原因;这是广播消息完全安全的 16 位 Windows 时代的遗留物。

不幸的是,这在某种程度上是 DDE 中的一个基本问题。推荐的解决方法是干脆不使用 DDE;使用更现代的方法,例如命名管道DCOM甚至 TCP 套接字。

于 2011-08-18T17:50:29.913 回答
0

使用 SendMessageTimeout 而不是 SendMessage,这样挂起的应用程序就不会挂起您。

于 2012-06-20T14:52:05.077 回答