C++에서 x86, x64 프로그램은 서로 호환해서 사용할 수 없어서 별도로 만들어 사용해야 한다. 모든 프로그램을 자신 혹은 팀이 만들어 나간다면 아무런 문제가 없다. 하지만 외부로부터 제공되는 라이브러리나 개발이 종료된 라이브러리의 경우 32bit만 존재하는 경우가 종종 있다. 이럴 경우 두 프로그램의 통신을 이용하여 사용할 수 있다. 32bit 프로그램을 ATL로 둘러싸서 서버를 만든 후 64Bit 프로그램에서 해당 서버와 통신을 하게 된다.
서버 만들기 (ATL Project)
Visual Studio에서는 ATL을 이용하여 서버 프로그램을 간단히 만들 수 있다.
C++ 프로젝트에서 ATL/ATL Project를 선택한 뒤, Service(EXE)를 선택한 후 프로젝트를 생성한다. ServerX86과 ServerX86PS 프로젝트가 생성된다. ATL에서는 주로 ServerX86에서 작업하면 ServerX86PS는 자동으로 업데이트되기 때문에 ServerX86에만 집중하자.
프로젝트 이름 위에 마우스 우클릭하여 Class를 추가하도록 하자. C++에서 ATL을 선택하고 ATL Simple Object를 선택하자. IConnectX86이라는 이름을 적고 생성하자. 물론 이름은 만드는 사람이 정하면 된다.
생성된 Interface IIConnectX86을 마우스 우클릭하면 Method를 추가할 수 있다. Method 이름은 ShowMsg로 하고 in 체크박스에 체크한 뒤, 타입은 BSTR, 이름은 msg라고 하자. 인터페이스에 CString이나 std::string을 사용할 수 없다. BSTR이나 char를 사용해야 한다.
ShowMsg 인터페이스가 추가된 것을 확인할 수 있다. 해당 인터페이스가 실행되었을 때 메시지 박스가 생성되도록 코드를 만들어 주고, 컴파일하면 ServerX86/ServerX86/Debug 폴더에 ServerX86.tlb 파일이 생성된다. ServerX86/Debug 폴더에는 ServerX86.exe 파일이 생성된다. 해당 파일을 실행하면 서비스가 실행된다.
수동으로 등록하는 방법은 ServerX86.exe /regserver를 입력하면 된다.
클라이언트 만들기 (MFC Project)
이제 서버와 연결할 클라이언트 프로그램을 만들어야 한다. MFC 프로그램으로 만들어 보자.
C++/MFC에서 MFC Application을 선택한 뒤 ClientX64를 입력한 뒤, 간단하게 확인할 수 있도록 다이얼로그 타입으로 만들자. 그리고 ServerX86.tlb를 복사해서 ClientX64 폴더 아래 복사를 해두자.
그리고 ClientX64.cpp 상단에 아래와 같이 코드를 작성하자.
#pragma once
#import "ServerX86.tlb" no_namespace // import tbl file
// CClientX64Dlg dialog
class CClientX64Dlg : public CDialogEx
{
...
tlb 파일을 import 한 뒤 컴파일을 하면, ClientX64/ClientX64/Debug 폴더에 serverx86.tih, serverx86.tli가 생성된다. 이것을 include 한다.
#include "x64\Debug\serverx86.tlh"
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialogEx
이제 실제 SeverX86 서비스를 사용해 보자.
다이얼로그에 Edit Control과 Button을 하나 만들고, 이벤트를 만들어 두도록 하자. 그리고 아래와 같이 코드를 추가한다.
void CClientX64Dlg::OnBnClickedShowMsg()
{
UpdateData(TRUE);
BSTR strMsg = m_strMsgStr.AllocSysString();
// TODO: Add your control notification handler code here
CComPtr<IIConnectX86> server;
server.CoCreateInstance(__uuidof(IConnectX86), NULL, CLSCTX_LOCAL_SERVER);
server->ShowMsg(strMsg);
}
CoCreateInstnace는 사용할 때 한 번만 사용하면 된다. 그렇기 때문에 계속해서 사용할 경우에는 멤버나 전역으로 선언해서 사용하면 된다. 에디터 박스 입력한 글자는 메시지 박스로 정확히 출력됨을 볼 수 있다.
이를 참고로 x86 라이브러리에 대한 인터페이스를 만들어 응용하면 x64 프로그램에서도 얼마든지 사용할 수 있다.
'Program Language > API | MFC' 카테고리의 다른 글
[MFC] Frame Caption 고정하기 (0) | 2022.04.15 |
---|---|
[MFC] CString ↔ BSTR (0) | 2022.04.14 |
[MFC] Control 보여주고 숨기기 (확인하기) (0) | 2022.03.11 |
[MFC] 따라하기 06. 순차적으로 원 그리기 (0) | 2022.03.09 |
[MFC] TreeCtrl Node 모두 확장하기 (2) | 2021.11.23 |