|
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 메세지가 유실될 수 있나요?
: 유실된다면 어떤 경우에 유실될 수 있을까요?
|