MFC 타 프로그램 간 통신. MX Component를 64bit 프로그램에서 사용하기 위한 방법
C++/팁 2018. 5. 29. 23:38 |이 예졔는 64bit 프로그램에서 MX Component를 사용하기 위해 사용했었음.
(MX Component는 64bit 환경에서 연결 지원안됨.)
윈도우 메시지를 사용하기 때문에 윈도우 기반 MFC 환경에서 작성했고
1번 프로그램은 Unicode, 2번 프로그램은 MultiByte를 사용했다.
이에 따라 형변환 방식이 다를 것을 주의하여 사용.
다시 볼때 헷갈릴 수 있으므로 전역 변수 사용하지 않음.
64bit 프로그램 에서 등록이 안되는 32bit dll을 사용하기 위해 32bit 프로그램을 하나 만들어서 64bit 프로그램과
통신 용도로 사용.
비트와는 상관 없이 사용 가능.
보내는 부분 (1번 프로그램 -> 2번 프로그램)
1. 첫 번째 프로그램 에서 연결하고자 하는 두 번째 프로그램의 핸들 값을 가져온다. (예시는 Untitled - Another Program)
1 2 3 4 5 6 | void CTest::CheckWindow() { HWND m_hWndProgram; m_hWndProgram = ::FindWindow(NULL, _T("Untitled - Another Program")); } | cs |
프로그램 명을 기입할 때 두 번째 프로그램의 프로젝트 명이 아닌
프로그램 실행 시 아이콘 위에 마우스를 올려 놓을 때의 명칭
다음과 같은 경우 PLC Monitor Utility를 입력하면 된다. (e.g. ::FindWindow(NULL, _T("PLC Monitor Utility");)
m_hWndProgram에 NULL이나 0이 아닌 값이 들어오면 성공.
(주의. 동일한 명칭의 폴더가 열려 있으면 폴더의 핸들 주소를 읽어올 수 있다. 폴더와 프로그램 명칭은 다르게 사용하자.)
2. 핸들 가져온 것을 확인했으니 보내보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | void CTest::SendResultMessage() { int nNum = 1; CString strResult = _T("Test"); COPYDATASTRUCT CopyDataStruct; CopyDataStruct.dwData = nNum; CopyDataStruct.cbData = strResult.GetLength() + 1; CopyDataStruct.lpData = (LPSTR)(LPCTSTR)strResult; HWND m_hWndProgram; if (m_hWndProgram == NULL) { m_hWndProgram= ::FindWindow(NULL, _T("Untitled - Another Program")); } if (m_hWndProgram) { LRESULT Res = ::SendMessage(m_hWndProgram, WM_COPYDATA, (WPARAM)this->m_hWnd, (LPARAM)&CopyDataStruct); m_hWndProgram = NULL; } } |
전송할 때에는 윈도우에서 제공하는 COPYDATASTRUCT 구조체를 사용하면 된다.
COPYDATASTRUCT는 dwData, cbData, lpData 세 개의 항목밖에 없고
본 예제에서
dwData는 데이터가 무엇인지 구분할 수 있는 숫자.
cbData는 보내고자 할 데이터의 크기.
lpData는 보낼 데이터로 사용.
구분할 기준이 더 필요하다면 데이터 앞에 숫자를 넣고 구분자를 추가하거나 (e.g. 2.Test)
dwData에 바이트 단위로 구분할 숫자를 넣으면 된다.
그리고 보내기 전에 핸들을 한번 더 확인하는 이유는 예외 사항을 방지하기 위해서이다.
데이터를 넣었고 2번 프로그램의 핸들도 확인했다면 이제 ::SendMessage를 이용하여 전송하면 된다.
SendMessage의 파라미터는
첫 번째. 목적지의 핸들. (현재는 2번 프로그램의 핸들)
두 번째. 목적지에서 받을 위치 (목적지의 메인에서 동작하는 윈도우 메시지)
세 번째. 현재 프로그램의 핸들 (중요하지 않다. 0 넣어도 됨. WPARAM)
네 번쨰. 보낼 구조체. (LPARAM)
받는 부분 (2번 프로그램)
3. 2번 프로그램에서 WM_COPYDATA를 추가해준다.
2번 프로그램의 다이얼로그 리소스 화면에서 오른쪽 마우스 클릭 후 속성 클릭.
이후 OnCopyData를 추가해 준다.
4. OnCopyData 구성.
OnCopyData를 정상적으로 추가했으면 메인부분에 OnCopyData 함수가 생성된다.
이후 pCopyDataStruct를 사용하면 끝.
1 2 3 4 5 6 7 8 9 10 11 | void CAnother_ProgramDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) { if (pCopyDataStruct->lpData && pCopyDataStruct->cbData > 0) { int nNum = (int)pCopyDataStruct->dwData; CString strData = static_cast<LPSTR>(pCopyDataStruct->lpData); } return CDialogEx::OnCopyData(pWnd, pCopyDataStruct); } | cs |
static_cast<LPSTR>은 2번 프로그램이 Multibyte라서 사용.
UniCode 환경이라면
1 2 3 4 5 6 7 8 9 10 11 12 | void CAnother_ProgramDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) { char temp[256]; if (pCopyDataStruct->lpData && pCopyDataStruct->cbData > 0) { strcpy(temp, (char*)pCopyDataStruct->lpData); CString strData; strData.Format(_T("%S"), temp); return CDialogEx::OnCopyData(pWnd, pCopyDataStruct); } | cs |
CString으로 받을 때 이렇게 사용하면 된다.
서로 주고받으려고 할 경우 2번 프로그램에도 똑같이 전송부를 만들고 1번 프로그램에 WM_COPYDATA를 추가하면 된다.
(주의. SendMessage의 경우 1번 프로그램에서 2번 프로그램으로 전송시 OnCopyData에서 리턴하기 전까지
1번 프로그램은 묶여있다. 빠르게 처리하기 위해서는 OnCopyData에서 멤버변수에 할당한 후, 쓰레드에서
멤버변수에 값이 들어왔는지 확인 후 처리하는 방법을 추천)
'C++ > 팁' 카테고리의 다른 글
MFC 타 프로그램 간 통신. MX Component를 64bit 프로그램에서 사용하기 위한 방법 2-2 (Client) (4) | 2021.08.03 |
---|---|
MFC 타 프로그램 간 통신. MX Component를 64bit 프로그램에서 사용하기 위한 방법 2-1 (Server) (8) | 2021.08.03 |
C++ 및 C#에서 OpenCV 추가 방법. (Nuget이용) (0) | 2020.01.09 |
MFC ListControl Column Check (0) | 2018.10.08 |
Visual Studio로 C,C++ 개발 시 생기는 sdf, ipch파일 관리 (1) | 2018.03.06 |