[MFC] WM_COPYDATA

저번에 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 문자열을 입력하고 전송, 그리고 받아서 표시하는 겁니다.

이제 실행 해서 확인해 봅니다.