Post List

2014년 12월 25일 목요일

WM_COPYDATA 를 사용한 Process 간 메세지 전송

1.요약
서로다른 윈도우끼리(다른 프로세스에도 적용됨) 데이터를 주고 받고자 할때 윈도우에서 제공하는 WM_COPYDATA를 사용해 보기로 한다.

2.본문
하나의 윈도우에는 윈도우가 관리하는 논리적 주소공간이 있다. 이러한 이유때문에 하나의 윈도우에서 다른 윈도우로 포인터를 넘겨주고자 한다면 그리 쉬운방법이 아님을 알 수 있다. 하지만, WM_COPYDATA를 사용하면 논리적 주소공간에 상관없이 다른 윈도우로 한쪽의 논리적 주소를 넘길 수 있다. 예제를 살펴보기로 하자.

3.예제


// source window에서..

void CSourceWnd::Write(const void* lpBuf, UINT nCount)
{
 CWnd *pTraceWnd = CWnd::FindWindow(TRACEWND_CLASSNAME, NULL);

 if (pTraceWnd)
 {
  COPYDATASTRUCT cds;
  cds.dwData = ID_COPYDATA_TRACEMSG; /* Flag 용도 */
  cds.cbData = nCount;
  cds.lpData = (void*)lpBuf;
  pTraceWnd->SendMessage(WM_COPYDATA, (WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(), (LPARAM)&cds);
 }
 else
 {
  AfxMessageBox("윈도우를 찾을 수 없습니다.");
 }
}

//////////////////////////////////////////////////////

// target windows에서..
// 메세지 핸들링 설치

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
 ON_MESSAGE(WM_COPYDATA, OnTraceMsg)
.
.
.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

LRESULT CMainFrame::OnTraceMsg(WPARAM wParam, LPARAM lParam)
{
 COPYDATASTRUCT* pcds = (COPYDATASTRUCT*)lParam;
 // pcds 를 사용한다..
 return 0;
}




원문 : http://cafe.naver.com/cyberzone/170

댓글 없음:

댓글 쓰기