저번에 SendMessage와 PostMessage에 대해 글을 썼었습니다.
몇 번 사용해보시면 알겠지만 사용자 메시지를 정의하여 SendMessage와 PostMessage로는 많고 다양한 데이터를 보낼 수 없습니다. 그럴 때는 WM_COPYDATA를 사용하여 구조체를 전송하면 프로세스간 통신에서 데이터를 쉽게 보낼 수 있습니다.
대화 상자를 하나 생성해 주시고 아래와 같이 Static과 Edit Control을 만들어 줍니다.
Static Control은 m_stMyHwnd로, Edit Control은 m_edTargetHwnd로 선언해줍니다.
그리고 OnInitDialog에 아래와 같이 코딩합니다.
HWND myHwnd = this->GetSafeHwnd();
CString sMyHwnd;
sMyHwnd.Format( _T( "%x" ), myHwnd );
m_stMyHwnd.SetWindowText( sMyHwnd );
SendMessage를 하기 전에 헤더파일에 구조체를 선언합니다.
typedef struct _ST_COPY_DATA
{
int iNum;
TCHAR atcData[MAX_PATH];
} ST_COPY_DATA;
확인 버튼을 더블 클릭해서 아래와 같이 코딩합니다.
void CMFCApplication1Dlg::OnBnClickedOk()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
CString sTargetHwnd;
m_edTargetHwnd.GetWindowText( sTargetHwnd );
HWND hwnd = (HWND)_tcstol( sTargetHwnd, NULL, 16 );
if ( NULL != hwnd )
{
DWORD dwResult;
COPYDATASTRUCT data;
memset( &data, 0, sizeof(data) );
ST_COPY_DATA stData;
stData.iNum = 0;
_tcscpy_s( stData.atcData, MAX_PATH, _T("SEND CopyData") );
data.dwData = 0; // 원하는 값 입력 가능
data.cbData = sizeof( stData ); // 구조체 크기
data.lpData = &stData; // 구조체 전달
dwResult = (DWORD)::SendMessage( hwnd, WM_COPYDATA, 0, (LPARAM)&data );
}
}
클래스 뷰에서 대화상자 클래스를 선택 하시고, WindowProc를 선택해줍니다.
WindowProc에 아래와 같이 코딩합니다.
LRESULT CMFCApplication1Dlg::WindowProc( UINT message, WPARAM wParam, LPARAM lParam )
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
COPYDATASTRUCT *pData = (COPYDATASTRUCT *)lParam;
switch ( message )
{
case WM_COPYDATA:
{
ST_COPY_DATA stData;
memcpy( &stData, pData->lpData, sizeof( stData ) );
CString sMsg;
sMsg.Format( _T( "%d, %s" ), stData.iNum, stData.atcData );
AfxMessageBox( sMsg );
}
break;
}
return CDialogEx::WindowProc( message, wParam, lParam );
}
코드 자체는 간단 하죠? 구조체에 0과 SEND Copydata 문자열을 입력하고 전송, 그리고 받아서 표시하는 겁니다.
이제 실행 해서 확인해 봅니다.