C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[36365] Re:[질문] WM_COPYDATA 메세지 유실?
유영인 Cuperido [cuperido] 2885 읽음    2004-07-20 12:09
PostMessage는 메시지가 유실될 수 있지만, SendMessage는 유실이 되지 않습니다.
확실하게 보내졌을때만 Callback이 되며, (SendMessageTimeOut API는 시간이 지나면 나옴)
못 보냈을 경우에는 응답 없음 상태로 계속 대기를 합니다.

그런데, WM_COPYDATA는 데이터 스트럭쳐를 보내야 하므로, 해제 타이밍이 틀리면 엉뚱한 참조가
될 수 있으니 PostMessage는 사용을 못하게 금지하고 있습니다.

쓰레드로 동시에 SendMessage가 가더라도 문제는 마찬가지 입니다. 실질적으로 메시지를
받는 어플리케이션은 순차적으로 메시지를 받게 되며, SendMessage 특성상 CallBack이 되지
않으면 당연히 프로그램은 멈춰 있을 것입니다.

아마도 유실이 되는 문제는 WM_COPYDATA 특성상 문제인 것 같지는 않고, 다른 문제와
연동이 되서 생긴 문제 같습니다.

만약에, 정 찜찜하시다 싶으시면 SendMessage에 해당하는 CallBack을 받으시면 됩니다. :)


cuperido


// 메시지 받는 쪽
void __fastcall TForm1::MessageProcess(TMessage &tmMessage)
{

ShowMessage("메시지 #" + IntToStr(tmMessage.Msg) + "을 받음");
tmMessage.ResultLo = 1;

}

// 메시지 보내는 쪽
void __fastcall TForm1::Button1Click(TObject *Sender)
{

HWND              hdHandle = FindWindow(NULL, "TESTFORM");
int               itResult;


itResult = SendMessage(hdHandle, WM_USER + 1, 0, 0);

if(itResult) ShowMessage("전송 성공");
         else ShowMessage("전송 실패");


}


Starlet 님이 쓰신 글 :
: 안녕하세요.
: 게시판을 검색하다가 WM_COPYDATA사용시 메세지가 유실될수 있으니 조심하라는 말을 봤는데 정말 WM_COPYDATA 메세지가 유실될 수 있나요?
: 유실된다면 어떤 경우에 유실될 수 있을까요?

+ -

관련 글 리스트
36357 [질문] WM_COPYDATA 메세지 유실? Starlet 1074 2004/07/20
36365     Re:[질문] WM_COPYDATA 메세지 유실? 유영인 Cuperido 2885 2004/07/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.