SendMessage () WINAPI зависает при использовании для подключения к серверу DDE - PullRequest
2 голосов
/ 18 августа 2011

У меня есть клиентское приложение DDE, которое подключается к приложению сервера DDE с помощью SendMessage() WINAPI.После вызова 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.

Делая это, я полагаю на стороне клиентая могу получить дескриптор окна сервера DDE с уникального имени (используя FindWindow() winapi) и вместо широковещания, используя SendMessage(), я могу отправить сообщение непосредственно на сервер DDE, используя дескриптор окна.

Если вы чувствуете себя вышеметод получения дескриптора окна сервера DDE невозможен или не рекомендуется, поэтому дайте мне знать другой метод использования SendMessage() winapi для подключения к серверу DDE.

Ответы [ 2 ]

2 голосов
/ 18 августа 2011

Если другой процесс, любой процесс , спит в своем потоке пользовательского интерфейса и не обрабатывает сообщения, широковещательные сообщения будут зависать . Еще одна причина прекратить использование DDE ; это пережиток тех времен 16-битной Windows , когда широковещательные сообщения были совершенно безопасны .

К сожалению, это несколько фундаментальная проблема в DDE. Рекомендуемый обходной путь - просто не использовать DDE; использовать более современные методы, такие как именованные каналы , DCOM или даже сокеты TCP.

0 голосов
/ 20 июня 2012

Используйте SendMessageTimeout вместо SendMessage, чтобы зависшие приложения не повесили вас.

...