Program Language/API | MFC

[ATL/MFC] 32Bit Software를 64Bit Software에서 사용하기

야곰야곰+책벌레 2022. 4. 14. 11:44
728x90
반응형

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 프로그램에서도 얼마든지 사용할 수 있다.

 

ClientX64.zip
0.13MB
ServerX86.zip
0.02MB

728x90
반응형