엑셀 64비트 추가 기능 호환성 완벽 가이드: 32비트 애드인 충돌 해결과 재컴파일 체크리스트

이 글의 목적은 엑셀 64비트 환경에서 추가 기능이 로드되지 않거나 동작하지 않는 문제를 체계적으로 진단하고, 애드인 유형별 호환성 원칙과 재컴파일·설정 변경·레지스트리 점검 절차를 제공하여 현장에서 즉시 적용 가능하도록 돕는 것이다.

왜 64비트 엑셀에서 추가 기능이 깨지는가

엑셀의 비트수와 추가 기능의 비트수가 일치하지 않으면 로드에 실패하거나 기능 일부가 작동하지 않는 경우가 발생한다. 32비트 바이너리 코드는 64비트 프로세스에서 직접 실행되지 않는다. 반대로 64비트 바이너리는 32비트 엑셀에서 동작하지 않는다. COM 서버, VSTO, XLL(C/C++), RTD, VBA 선언부 등은 모두 비트수 영향을 받는다. 파일 확장자만 같아도 내부 빌드 타깃이 다르면 호환되지 않는다.

엑셀과 애드인의 비트수 확인

  • 엑셀 비트수 확인: 엑셀 실행 → 계정 → Excel 정보 → ‘64비트’ 또는 ‘32비트’ 표기를 확인한다.
  • VBA에서 확인: 즉석창에 ? Application.OperatingSystem 을 입력하여 64-bit 문자열 포함 여부를 본다.
  • .NET/VSTO 애드인: 빌드 출력의 Platform target 확인(AnyCPU, x86, x64)한다.
  • XLL: 빌드 산출물 이름에 x64 표시 여부 또는 프로젝트 설정의 플랫폼을 확인한다.
주의 : “AnyCPU”는 VSTO와 같이 COM 상호운용을 사용하는 경우에도 항상 안전하지 않다. Office Interop/Native 콜 경계가 있으면 명시적 x64 타깃이 필요하다.

추가 기능 유형별 호환성 영향과 해결 전략

애드인 유형 파일/형태 64비트 호환성 핵심 대표 해결책 비고
VBA 애드인 .xla, .xlam Declare 문, 포인터 크기 VBA7/PtrSafe/LongPtr로 API 선언 수정 코드 수정만으로 해결 가능
COM 애드인 .dll + 레지스트리 모듈 비트수, 레지스트리 뷰 x64로 재컴파일, HKLM/HKCU 올바른 키 작성 레지스트리 LoadBehavior=3 확인
VSTO 애드인 .vsto + .dll Platform target, PIAs x64 빌드, ClickOnce 서명/신뢰구성 갱신 Manifest 경로/서명 만료 점검
XLL(C/C++) .xll 호출 규약, 포인터 크기 x64로 재빌드 또는 Excel-DNA 패키징 32/64 별도 파일 제공 권장
RTD 서버 COM 서버 서버 비트수 x64 COM 서버 등록, ProgID 일치 서비스·권한도 점검
외부 자동화 exe/COM 프로세스 간 RPC 서버/클라이언트 비트수 분리 Out-of-proc 권장

VBA 애드인의 64비트 전환: PtrSafe와 LongPtr

VBA7(Office 2010 이상)에서는 64비트 엑셀에서 Windows API를 호출하려면 PtrSafe 선언과 포인터 크기 의존형 LongPtr 을 사용해야 한다. 조건부 컴파일 지시문으로 32/64비트를 동시에 지원할 수 있다.

  
' 32/64비트 겸용 선언 예시 #If VBA7 Then Private Declare PtrSafe Function GetTickCount64 Lib "kernel32" () As LongLong Private Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongPtrA" _ (ByVal hWnd As LongPtr, ByVal nIndex As Long) As LongPtr #Else Private Declare Function GetTickCount Lib "kernel32" () As Long Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _ (ByVal hWnd As Long, ByVal nIndex As Long) As Long #End If 
  
주의 : 64비트에서 Long 은 여전히 32비트 정수이다. 포인터·핸들은 LongPtr 또는 LongLong 을 사용한다.

COM/VSTO 애드인의 64비트 재배포 체크리스트

  1. 프로젝트 타깃: x64 로 설정한다. AnyCPU는 Interop 경계가 있으면 예외 발생 가능하다.
  2. Office PIAs: 설치 버전과 일치하는 참조를 사용한다. 바인딩 리디렉션이 필요한지 점검한다.
  3. 레지스트리: HKCU\Software\Microsoft\Office\Excel\Addins\{ProgID} 또는 HKLM LoadBehavior=3 설정을 확인한다.
  4. Wow64 구분: 64비트 등록은 HKLM\Software\Microsoft\Office , 32비트는 HKLM\Software\WOW6432Node\Microsoft\Office 로 구분된다.
  5. 서명/배포: ClickOnce/VSTO의 매니페스트 경로·서명을 갱신한다. 신뢰 센터에서 위치 신뢰를 부여한다.
  6. 차단 요소 해제: 다운로드 파일은 파일 속성의 ‘차단 해제’를 수행한다.

레지스트리 및 차단 목록 점검

  • 비활성 목록: 파일 → 옵션 → 추가 기능 → 관리: 비활성화된 항목 에서 복구한다.
  • Resiliency: HKCU\Software\Microsoft\Office\16.0\Common\Resiliency\DisabledItems 키를 점검한다.
  • 트러스트 센터: 매크로 설정과 신뢰할 수 있는 게시자/위치를 확인한다.
  
rem COM 애드인 강제 로드 값 확인 reg query "HKCU\Software\Microsoft\Office\Excel\Addins\Your.ProgID" /v LoadBehavior rem 3이면 로드, 2이면 비활성화됨 
  

XLL 애드인: 호출 규약과 64비트 빌드

XLL은 C/C++로 작성된 네이티브 애드인이다. 64비트 엑셀을 위해서는 x64로 재컴파일해야 한다. 함수 포인터와 구조체 정렬을 재검토하고, 콜백의 호출 규약을 __stdcall 에 맞춘다. 32/64비트 파일을 별도로 제공하여 사용자 환경에 맞게 로드하도록 한다.

주의 : 오래된 32비트 전용 XLL은 64비트 엑셀에서 로드 목록에 보이더라도 실제 로드는 실패한다. 오류 메시지가 없을 수 있으므로 이벤트 로그 또는 로깅을 추가한다.

VSTO/COM 배포 패턴: AnyCPU 오해 바로잡기

VSTO 애드인이 AnyCPU로 빌드되어도 내부에서 로드되는 네이티브 컴포넌트나 P/Invoke가 있으면 런타임 예외가 발생한다. PIAs 버전 불일치도 빈번하다. Office 버전 업그레이드 후에는 다시 서명·배포를 수행한다.

파일 경로와 설치 위치

  • 64비트 애드인: C:\Program Files\ 하위에 배포한다.
  • 32비트 애드인: C:\Program Files (x86)\ 하위에 배포한다.
  • 사용자별 설치: 사용자 프로필 경로의 쓰기 권한과 UAC 프롬프트를 고려한다.

보안 정책과 스마트 스크린

기업 환경에서는 그룹 정책이 외부 서명 없는 애드인을 차단할 수 있다. 관리자가 코드 서명 인증서를 배포하고 신뢰할 수 있는 게시자로 등록해야 한다.

문제 재현과 로깅 전략

  • 엑셀 안전 모드로 비교: excel.exe /safe 로 기동하여 다른 애드인 충돌을 배제한다.
  • VSTO 로그: VSTO_SUPPRESSDISPLAYALERTS=0 , VSTO_LOGALERTS=1 환경변수로 경고 표시를 확인한다.
  • COM 로드 진단: 로드 이벤트에 로깅을 추가하고 예외 콜스택을 기록한다.

현장용 10분 점검 루틴

  1. 엑셀 비트수 확인 후 애드인 빌드 타깃 일치 여부를 점검한다.
  2. 차단 해제 및 신뢰 센터 설정을 검토한다.
  3. 비활성화된 항목 목록에서 복구한다.
  4. 레지스트리 LoadBehavior=3, Resiliency 키를 확인한다.
  5. COM/VSTO는 x64 재컴파일, XLL은 x64 빌드를 준비한다.
  6. 의존성 네이티브 DLL의 비트수를 확인한다.
  7. 관리자 권한으로 설치 스크립트를 재실행한다.
  8. 안전 모드로 충돌 여부를 비교한다.
  9. 로그 수집 후 예외 근원을 수정한다.
  10. 최종적으로 사용자별/전역 설치 선택을 정리한다.

자주 발생하는 오류와 해결

현상 원인 해결
추가 기능이 목록에는 보이나 체크해도 해제됨 로드 실패로 자동 비활성화 비활성화된 항목에서 복구, 예외 로그 분석, x64 재빌드
로드 시 “잘못된 형식” 오류 비트수 불일치(BadImageFormat) 모듈 및 종속 DLL을 x64로 통일
RTD 함수가 갱신되지 않음 COM 서버 미등록 또는 비트수 불일치 x64 서버 재등록, ProgID 점검
VBA API 호출에서 충돌 PtrSafe/LongPtr 미적용 VBA7 조건부 컴파일로 선언 수정
XLL 함수 일부만 동작 구조체 패킹/호출 규약 불일치 프로젝트 설정 재검토 후 재빌드

배포 자동화 예시

  
:: 64비트 COM 애드인 설치 스크립트 예시 set ADDIN_PROGID=YourCompany.ExcelAddin set ADDIN_DLL="%ProgramFiles%\YourCompany\ExcelAddin\Addin64.dll"
reg add "HKCU\Software\Microsoft\Office\Excel\Addins%ADDIN_PROGID%" /v Description /t REG_SZ /d "Your Excel Add-in" /f
reg add "HKCU\Software\Microsoft\Office\Excel\Addins%ADDIN_PROGID%" /v FriendlyName /t REG_SZ /d "Your Add-in" /f
reg add "HKCU\Software\Microsoft\Office\Excel\Addins%ADDIN_PROGID%" /v LoadBehavior /t REG_DWORD /d 3 /f

:: 필요 시 COM 등록
"%SystemRoot%\System32\regsvr32.exe" /s %ADDIN_DLL%

  

파워셸로 Office 비트수와 애드인 경로 진단

  
# Office 비트수 판별 및 주요 레지스트리 키 나열 $officeX64 = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Office\ClickToRun\Configuration" -ErrorAction SilentlyContinue).Platform if ($officeX64 -eq "x64") { "Excel: 64-bit" } else { "Excel: 32-bit or unknown" }
Excel 애드인 등록 키 확인
Get-ChildItem "HKCU:\Software\Microsoft\Office\Excel\Addins" | ForEach-Object {
$.PSChildName
Get-ItemProperty $.PSPath | Select-Object FriendlyName, Description, LoadBehavior
}

  

VBA 선언 템플릿 모음

  
' 64비트 안전한 Sleep 예시 #If VBA7 Then Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) #Else Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) #End If
' 윈도우 핸들 타입
#If VBA7 Then
Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
#Else
Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function GetActiveWindow Lib "user32" () As Long
#End If

  

배포 정책 수립 권고안

  • 제품 라인업을 32비트와 64비트 별도로 패키징한다.
  • 설치 관리자는 OS/Office 비트수를 자동 감지하여 맞는 패키지를 배포한다.
  • 코드 서명 인증서를 정기 갱신한다.
  • 변경 이력과 의존성 목록을 설치 디렉터리에 포함한다.

현업 사례 요약

대부분의 “로드되지 않음”은 비트수 불일치나 레지스트리 LoadBehavior 값 문제에서 기인한다. 다음 두 가지 조치만으로 70% 이상 해결된다. 첫째, 애드인을 x64로 재컴파일하여 재배포한다. 둘째, 사용자 환경에서 DisabledItems와 LoadBehavior를 정상화한다. 나머지는 보안 정책, 서명, 네이티브 의존성 정합성 문제로 수렴한다.

FAQ

AnyCPU로 빌드했는데도 로드 오류가 발생한다. 왜 그런가

AnyCPU는 관리 코드 자체는 양쪽에서 동작하지만 네이티브 DLL 호출, 레지스트리 뷰, PIAs 바인딩이 개입되면 x64 전용 빌드가 필요하다. P/Invoke 대상과 의존 DLL을 포함해 모두 x64로 정렬해야 한다.

32비트 엑셀만 지원하는 오래된 XLL을 그대로 쓰는 방법이 있나

64비트 엑셀에서는 직접 사용이 불가능하다. 중간 프록시 프로세스 또는 재컴파일이 필요하다. Excel-DNA 또는 소스 재빌드를 검토한다.

레지스트리에 등록했는데 목록에 나타나지 않는다

키 위치가 잘못되었을 가능성이 높다. x64는 WOW6432Node가 아닌 일반 소프트웨어 키에 등록해야 한다. ProgID와 매니페스트 경로도 확인한다.

VBA 애드인을 배포할 때 사용자 권한 이슈를 줄이려면

신뢰할 수 있는 위치에 배포하고 디지털 서명된 매크로를 사용한다. 그룹 정책으로 신뢰 위치를 미리 배포하면 경고를 줄일 수 있다.

RTD 서버가 64비트로 등록되었는지 확인하려면

ProgID를 기반으로 CLSID와 InprocServer32 경로를 조회하여 Program Files 또는 Program Files (x86) 위치를 확인한다. 64비트면 전자가 정상이다.