32bit 앱에서 64bit DLL을 호출하는 방법 - COM 브리지가 도움이 되는 케이스 스터디
· 업데이트: · 小村 豪 · COM, Windows 개발, 32bit, 64bit
수정 이력(초판, 2026년 01월 25일 공개)
- 최초 공개
이 글을 인용하기(DOI: 10.5281/zenodo.21635077)
이 글은 Zenodo에 보관되어 있습니다. 항상 최신 버전으로 연결되는 DOI와 지금 보고 있는 버전에 고정된 DOI를 아래에 함께 제시합니다.
小村 豪 (2026). 「32bit 앱에서 64bit DLL을 호출하는 방법 - COM 브리지가 도움이 되는 케이스 스터디」. 합동회사 코무라소프트. https://doi.org/10.5281/zenodo.21635077 https://staging.comcomponent.com/ko/blog/2026/01/25/002-com-case-study-32bit-to-64bit/
- DOI(최신 버전)
- 10.5281/zenodo.21635077
- DOI(이 버전)
- 10.5281/zenodo.21635078
32bit 앱에서 64bit DLL을 호출하는 방법 - COM 브리지가 도움이 되는 케이스 스터디
32bit 앱에서 64bit DLL을 호출하고 싶다는 요건은 Windows에서는 꽤 전형적입니다. 특히 기존 자산을 남긴 채 64bit 쪽 기능만 쓰고 싶을 때, COM 브리지 구성이 현실적인 해답이 되기 쉽습니다.
1. 상정 상황
32bit의 기존 앱을 유지하면서 64bit DLL의 처리를 쓰고 싶은 경우입니다.
하지만 32bit 프로세스는 64bit DLL을 로드할 수 없습니다. 이것은 OS 수준의 제약입니다.
흔한 상황은 다음과 같은 것들입니다.
- 기존 32bit 앱은 자산으로서 크기가 크고, 바로 이전할 수 없음
- 64bit DLL 쪽에 신기능이 있거나 의존 라이브러리가 64bit 전용
- 32bit 쪽에서 「타입 있는 형태로」 호출하고 싶음
이때 「같은 프로세스 안에서 호출하는 것」은 불가능합니다.
2. 해결 방법
해결의 기본은 Out-of-proc COM(EXE 서버)으로 분리하는 것입니다.
64bit DLL은 64bit COM 서버(EXE)에서 호출하고, 32bit 앱은 COM을 경유해 사용합니다.
흐름은 다음과 같습니다.
- 64bit COM LocalServer(EXE)를 준비하고, 내부에서 64bit DLL을 호출
- COM 인터페이스(IDL/TypeLib)를 공유하고 타입을 공개
- 32bit 앱은 COM을 「타입 있는 형태로」 호출(Proxy/Marshal로 교환)
주의점으로는 다음이 있습니다.
- 32bit/64bit의 등록은 별도(WOW6432Node 포함)
- 독자 구조체는 마샬링 설계가 필요
- IPC 오버헤드가 있으므로 고빈도 호출은 주의
즉, 「64bit 처리를 별도 프로세스로 내보내고 COM으로 다리를 놓는 것」이 왕도입니다.
3. 처리 흐름(시퀀스 다이어그램)
다음은 32bit 앱이 64bit DLL의 처리를 호출할 때의 흐름입니다.
sequenceDiagram
participant App as 32bit 클라이언트 앱
box rgba(100,100,255,0.1) COM이 자동으로 처리(개발자는 의식 불필요)
participant Proxy as COM Proxy<br/>(32bit 쪽)
participant RPC as RPC/IPC<br/>(프로세스 간 통신)
participant Stub as COM Stub<br/>(64bit 쪽)
end
participant Server as 64bit COM Server<br/>(EXE)
participant DLL as 64bit DLL
App->>Proxy: ICalcService.Add(1, 2)
rect rgba(100,100,255,0.1)
Note over Proxy: 파라미터를 마샬링
Proxy->>RPC: 직렬화된 데이터
RPC->>Stub: 프로세스 경계를 넘어 전송
Note over Stub: 파라미터를 언마샬링
end
Stub->>Server: Add(1, 2)
Server->>DLL: 네이티브 함수 호출
DLL-->>Server: 결과: 3
Server-->>Stub: 결과: 3
rect rgba(100,100,255,0.1)
Note over Stub: 반환 값을 마샬링
Stub-->>RPC: 직렬화된 결과
RPC-->>Proxy: 프로세스 경계를 넘어 전송
Note over Proxy: 반환 값을 언마샬링
end
Proxy-->>App: 결과: 3
포인트:
- 32bit 앱은
ICalcService인터페이스를 통해 타입 안전하게 호출할 수 있음 - COM 런타임이 자동으로 Proxy/Stub를 생성·관리
- 프로세스 간 통신 오버헤드가 있으므로, 세세한 호출보다 일괄 처리가 바람직함
4. 샘플 코드(이미지)
다음은 개념의 이미지입니다. 실제로는 등록이나 TypeLib 생성 등이 필요합니다.
// 공유 인터페이스(IDL 상당)
[ComVisible(true)]
[Guid("7A4B5B23-0A2F-4D2B-9D4D-8A2A92B8B001")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ICalcService
{
int Add(int a, int b);
}
// 64bit COM LocalServer(EXE 쪽)
[ComVisible(true)]
[Guid("1C9B6F4D-1E9A-4E61-9A4F-6A0F1D2D9A11")]
[ClassInterface(ClassInterfaceType.None)]
public class CalcService : ICalcService
{
public int Add(int a, int b)
{
// 여기서 64bit DLL을 호출
return a + b;
}
}
// 32bit 앱 쪽(클라이언트)
Type t = Type.GetTypeFromProgID("KomuraSoft.CalcService");
var calc = (ICalcService)Activator.CreateInstance(t);
int result = calc.Add(1, 2);
이 형태로 만들면 32bit 쪽은 「타입 있는 형태로」 다룰 수 있습니다.
COM이 내부에서 프록시/스텁을 사용해 IPC 경유로 호출해 줍니다.
5. 완전한 샘플 코드
위의 개념을 실제로 동작하는 형태로 구현한 샘플을 GitHub에서 공개하고 있습니다.
Call64bitDLLFrom32bitProc - GitHub
이 리포지토리에는 다음이 포함되어 있습니다.
- Call64bitDLLFrom32bitProc/ - 64bit COM LocalServer (EXE)
- X64DLL/ - 64bit DLL(실처리)
- X86App/ - 32bit 클라이언트 (WinForms)
- scripts/ - COM 서버 등록·해제 스크립트
README에 기재된 절차를 따라 빌드·등록하면 실제로 32bit 프로세스에서 64bit DLL을 호출하는 동작을 확인할 수 있습니다.
6. 참고 자료
- Component Object Model (COM)의 개요
https://learn.microsoft.com/en-us/windows/win32/com/component-object-model–com–portal - COM LocalServer32의 등록
https://learn.microsoft.com/en-us/windows/win32/com/localserver32 - COM 인터페이스의 기본
https://learn.microsoft.com/en-us/windows/win32/com/the-component-object-model - COM Interop(.NET에서의 이용)
https://learn.microsoft.com/en-us/dotnet/standard/native-interop/cominterop
관련 기사
같은 태그를 공유하는 최신 기사입니다. 더 가까운 주제로 지식을 넓힐 수 있습니다.
COM 컴포넌트나 OCX / ActiveX 개발에서 빠지기 쉬운 것 - Visual Studio의 32bit / 64bit, 등록, 관리자 권한의 덫을 정리
COM 컴포넌트와 ActiveX, OCX 개발에서 자주 만나는 0x80040154나 0x80070005를 비트 수, 등록 방식, HKCU와 HKLM 스코프, 관리자 권한이라는 네 축으로 풀어 Visual Studio 2022의 64bit화 시대에...
Office 2024/Microsoft 365에서 ActiveX가 작동하지 않는 원인과 확인 절차
Office 2024/Microsoft 365에서 ActiveX가 작동하지 않을 때, 기본값 비활성화, 32bit/64bit, COM 등록, 종속 DLL, IE 모드, Click-to-Run 로그를 확인하는 순서를 정리합니다.
VB6 애플리케이션은 언제까지 동작할까 ── 런타임 지원 현황과 현실적인 .NET 이전 진행 방법
VB6 애플리케이션은 언제까지 동작할까요. VB6 런타임의 지원 정책(Windows 11도 지원 대상)과 IDE 지원은 이미 종료되었다는 비대칭적인 현황을 정리하고, 전면 재작성・자동 변환・단계적 이전의 판단표, 이전 전 자산 파악, VB6와 ....
Windows 앱 외주·수탁 개발을 의뢰하기 전에 정리해야 할 것
Windows 앱의 외주·수탁 개발을 의뢰하기 전에, 기존 소프트웨어 개수, 장치 연계, COM/ActiveX, 배포·업데이트, 보수와 관련해 정리해야 할 포인트를 설명합니다.
Reg-Free COM이란 무엇인가 - 등록 불필요로 COM을 쓰는 구조와, 맞는 장면·맞지 않는 장면
Reg-Free COM은 COM 등록 정보를 매니페스트로 가져 앱 단위 액티베이션 컨텍스트로 해결하는 구조입니다. XCOPY 배포·버전 충돌·롤백을 가볍게 하는 한편, bitness·의존 DLL·TLB·설계 시 참조는 별개임을 정리하고 도입 판단...
관련 토픽
이 기사와 가까운 토픽 페이지입니다. 기사를 출발점 삼아 관련 서비스와 다른 기사로 이어집니다.
Windows 기술 토픽
Windows 개발, 장애 조사, 기존 자산 활용에 관한 KomuraSoft LLC 기사를 모은 토픽 허브입니다.
ActiveX 이관
COM / ActiveX / OCX 자산을 유지할지, 감쌀지, 교체할지의 단계적 판단을 정리한 토픽 페이지입니다.
32비트 / 64비트 상호 운용
32비트 / 64비트 상호 운용, 네이티브 경계, 관련된 Windows 설계 판단을 정리한 토픽 페이지입니다.
이 주제와 연결되는 서비스
이 기사는 다음 서비스 페이지로 이어집니다. 가까운 입구부터 확인해 주세요.
Windows 앱 개발
상주 처리, 장비 연동, 운영 로그, 유지 보수 가능한 구조가 필요한 Windows 데스크톱 애플리케이션을 지원합니다.
기존 자산 활용 & 이관 지원
COM / ActiveX / OCX 자산, 네이티브 코드, 32비트 의존성을 유지하면서 단계적인 이관 계획을 지원합니다.
자주 묻는 질문
이 기사 주제에 대해 상담 시 자주 나오는 질문을 모았습니다.
- 32bit 앱에서 64bit DLL을 직접 로드할 수 있나요?
- 아니요, 불가능합니다. 32bit 프로세스는 64bit DLL을 로드할 수 없으며, 이것은 OS 수준의 제약입니다. 같은 프로세스 안에서 호출하는 것 자체가 불가능하기 때문에, 기존 32bit 앱을 유지하면서 64bit DLL의 처리를 쓰고 싶다면 프로세스를 분리하는 우회 구성이 필요합니다.
- 32bit 앱에서 64bit DLL을 사용하려면 어떻게 하나요?
- 기본은 Out-of-proc COM(EXE 서버)으로 분리하는 것입니다. 64bit COM LocalServer(EXE)를 준비해 그 안에서 64bit DLL을 호출하고, COM 인터페이스(IDL/TypeLib)를 공유해 타입을 공개한 뒤, 32bit 앱은 COM을 경유해 타입 있는 형태로 호출합니다. COM 런타임이 Proxy/Stub을 자동으로 생성·관리해 프로세스 경계를 넘는 통신을 처리해 줍니다.
- COM 브리지 구성에서 주의할 점은 무엇인가요?
- 세 가지가 있습니다. 첫째, 32bit와 64bit의 COM 등록은 별도이며 WOW6432Node도 관련됩니다. 둘째, 독자 구조체를 주고받으려면 마샬링 설계가 필요합니다. 셋째, 프로세스 간 통신(IPC) 오버헤드가 있으므로 고빈도의 세세한 호출보다 일괄 처리가 바람직합니다.
- 실제로 동작하는 샘플 코드가 있나요?
- 네, GitHub의 Call64bitDLLFrom32bitProc 리포지토리에서 공개되어 있습니다. 64bit COM LocalServer(EXE), 실처리를 담당하는 64bit DLL, WinForms 기반 32bit 클라이언트, COM 서버 등록·해제 스크립트가 포함되어 있으며, README의 절차를 따라 빌드·등록하면 32bit 프로세스에서 64bit DLL을 호출하는 동작을 확인할 수 있습니다.