IPC (Inter Process Communication)
사용자 정의 메시지나 시스템 정의 메시지를 이용해서 상대방에게 전달할 수 있는 있는 부가적인 정보(WPARAM, LPARAM)는 간단한 정수값이나 윈도우 핸들값 정도이고, 문자열을 보내기는 어렵다. 이때 윈도우 95에 새롭게 추가된 메시지 WM_COPYDATA를 사용하면 쉽게 해결할 수 있다.
2. WM_COPYDATA 이용
WM_COPYDATA는 윈도우즈 시스템에서 사용하는 메시지이므로, 우리가 다시 정의할 필요는 없다. COPYDATASTRUCT 구조체는 WM_COPYDATA 메시지와 함께 전달될 부가적인 정보이다. WM_COPYDATA 메시지는 한 프로그램에서 다른 목적으로 여러 번 사용될 수 있다. WM_COPYDATA 메시지를 여러 번 사용하더라도 그 목적에 따라 구분할 수 있는 기준이 필요한데, 이 역할을 COPYDATASTRUCT 구조체의 멤버변수 dwData가 한다.
이번 예제는 IPC4, IPC5의 두 프로젝트이고 하나의 프로젝트에 두 개를 합친 형태이다.
1) 송신 프로그램을 만들어보자. IPC4 라는 이름으로 다이얼로그 베이스의 프로젝트를 하나 만든다.
2) 다음과 같이 다이얼로그 틀을 만든다. 위쪽에 에디트 박스, 아래에 버튼 2개를 놓는다. 각 컨트롤의 ID는 IDC_EDIT_DATA, IDC_BUTTON_SEND 이다. "종료" 버튼은 처음 다이얼로그 템플릿을 만들면 있는 "확인" 버튼(IDOK)에서 캡션만 바꾼 것이고, "취소" 버튼은 삭제했다.

3) 다음은 "보내기" 버튼에 대한 핸들러이다. 다음 코드에서
cds.lpData = (LPSTR)(LPCSTR)strData;
이 부분을 잘 살펴보자. 이것은 에디트 컨트롤에 입력된 문자열을 char* 형으로 형변환하는 과정이다. CString 타입을 char* 로 직접 변환시킬 수 없기 때문에 CString의 멤버함수 operator LPCTSTR을 중간에 사용한다.
void CIPC4Dlg::OnButtonSend()
{
//
TODO: Add your control notification handler code here
CString
strData;
// 에디트
박스의 문자열을 얻음
GetDlgItemText(IDC_EDIT_DATA,
strData);
COPYDATASTRUCT
cds;
cds.dwData = 1004;
// 사용목적에 따른 식별값
cds.cbData
= strData.GetLength()+1; // 전달될 정보 lpData의
크기
cds.lpData = (LPSTR)(LPCSTR)strData;
// 전달될 정보
CWnd
*pWnd = CWnd::FindWindow(NULL, "받기 프로그램");
if(!pWnd)
{
AfxMessageBox("Program
is not found!");
return;
}
pWnd->SendMessage(WM_COPYDATA,
(WPARAM)m_hWnd, (LPARAM)&cds);
}
4) 이제 수신 프로그램을 만들어보자. 프로젝트명은 IPC5이고, 역시 다이얼로그 베이스로 만든다.
5) 다이얼로그 템플릿은 다음과 같다. 에디트 박스 하나에 버튼 하나. 에디트 박스의 ID는 IDC_EDIT_DATA 이고, 확인 버튼은 그대로이다. 그리고 반드시 다이얼로그의 캡션은 "받기 프로그램" 으로 한다. FindWindow() 함수에서 사용하기 위해서이다.

6) 클래스 위저드에서 WM_COPYDATA 메시지를 선택해서 다음과 같이 핸들러를 작성한다.
BOOL CIPC5Dlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
// TODO: Add your
message handler code here and/or call default
switch(pCopyDataStruct->dwData)
{
case 1004 :
SetDlgItemText(IDC_EDIT_DATA,
(LPCSTR)pCopyDataStruct->lpData);
break;
}
return
CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
- the end of this article -