2011-08-18 4 views
2

SendMessage() WINAPI를 사용하여 DDE 서버 응용 프로그램에 연결하는 DDE 클라이언트 응용 프로그램이 있습니다. SendMessage() 호출 다음 DDE 서버에 대한 연결을 요청하는 동안 응답하지 않습니다. DDE 클라이언트 응용 프로그램과 서버 응용 프로그램 모두 VC++에 있습니다.SendMessage() DDE 서버에 연결할 때 WINAPI 응답하지 않는다

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 Server에 연결하는 다른 방법을 알려주십시오.

+0

FindWindow 대신 EnumWindows를 사용하면 올바른 창을 식별 할 확률이 훨씬 높아집니다. Spy ++를 사용하여 창 속성을 보면 클래스 이름이 필터링에 좋은 경향이 있습니다. GetClassName(). DDE는 끔찍한 btw입니다. –

답변

0

정지 된 응용 프로그램이 SendMessage 대신 SendMessageTimeout을 사용하면 중단되지 않습니다.

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 winapi를 사용하여 DDE 서버에 연결하는 다른 방법이 있습니다. – decisive

+0

대상 창의 HWND를 알면 직접 해당 특정 창으로 메시지를 보낼 수 있습니다. 나는이 접근법을 추천하지 않을 것이다. 문제는 어떻게 든 HWND를 찾아야한다는 것이며, 명명 된 파이프 나 DCOM 같은 최신 기법은 어쨌든 더 잘 작동하는 경향이 있다는 것입니다. – bdonlan

+0

DDE는 20 세기의 고대 레거시 코드에 대해서만 살아 있습니다. 왜 새로운 코드를 작성하고 있습니까? –

관련 문제