Office 2010 32비트 버전과 64비트 버전 간의 호환성

요약: 2GB 이상의 데이터를 사용하는 고객을 위해 이제 Microsoft Office 2010의 64비트 버전이 제공됩니다. 이 문서에서는 새로운 64비트 버전과 32비트 버전의 호환성 및 레거시 32비트 Office 응용 프로그램 관련 문제와 그 해결 방법에 대해 살펴봅니다(인쇄 페이지 7쪽).

마지막 수정 날짜: 2015년 4월 24일 금요일

적용 대상: Excel 2010 | Office 2007 | Office 2010 | Open XML | PowerPoint 2010 | SharePoint Server 2010 | VBA | Visual Basic for Applications 7.0 (VBA 7.0) | Word 2010

이 문서의 내용
Microsoft Office 2010의 32비트 버전과 64비트 버전 소개
시스템 비교(32비트 시스템과 64비트 시스템)
VBA 7 코드 베이스 소개
ActiveX 컨트롤 및 COM 추가 기능 호환성
응용 프로그래밍 인터페이스 호환성
조건부 컴파일 특성 사용
질문과 대답
결론
추가 자료

Applies to:   Microsoft Office 2010

게시 날짜:   2010년 3월

공급자: Microsoft Corporation

목차

  • Microsoft Office 2010의 32비트 버전과 64비트 버전 소개

  • 시스템 비교(32비트 시스템과 64비트 시스템)

  • VBA 7 코드 베이스 소개

  • ActiveX 컨트롤 및 COM 추가 기능 호환성

  • 응용 프로그래밍 인터페이스 호환성

  • 조건부 컴파일 특성 사용

  • 질문과 대답

  • 결론

  • 추가 자료

Microsoft Office 2010의 32비트 버전과 64비트 버전 소개

Microsoft Office 2010 시스템은 32비트와 64비트 버전이 모두 제공됩니다. 64비트 버전을 사용하는 경우 32비트 버전에 비해 훨씬 더 큰 데이터 집합으로 작업할 수 있습니다. 따라서 Microsoft Excel 2010에서 큰 수치로 작업하는 등의 경우에 특히 유용합니다.

새로운 64비트 버전 Microsoft Office 2010이 도입되면서, Microsoft VBA 7(Visual Basic for Applications 7.0)로 알려진 Microsoft VBA(Visual Basic for Applications)의 새 버전도 출시되었습니다. 이 새 버전은 32비트 및 64비트 응용 프로그램에서 모두 사용할 수 있습니다. 이 문서에서 설명하는 변경 내용은 64비트 버전 Microsoft Office 2010에만 적용됩니다. 32비트 버전 Office 2010을 사용하는 경우 이전 버전 Microsoft Office에서 작성한 솔루션을 수정하지 않고 계속 사용할 수 있습니다.

참고

Office 2010의 기본 설치를 선택하는 경우 64비트 시스템에서도 32비트 버전이 설치됩니다. 64비트 버전을 설치하려면 Office 2010 64비트 버전 설치 옵션을 명시적으로 선택해야 합니다.

VBA 7에서는 기존 Windows API(응용 프로그래밍 인터페이스) 문(Declare 문)을 64비트 버전에서 작동하도록 업데이트해야 합니다. 또한 주소 포인터를 업데이트하고 이러한 문에서 사용되는 사용자 정의 유형으로 창 핸들을 표시해야 합니다. 이 문서에서는 이러한 업데이트와 32비트 및 64비트 버전의 Office 2010 간 호환성 문제 및 권장 해결 방법에 대해 자세히 설명합니다.

시스템 비교(32비트 시스템과 64비트 시스템)

64비트 버전 Office 2010을 사용하여 작성된 응용 프로그램은 더 큰 주소 공간을 참조할 수 있으므로 이전보다 실제 메모리를 더 많이 사용할 수 있어, 데이터를 실제 메모리 안팎으로 이동하는 데 소요되는 오버헤드가 감소할 수 있습니다.

응용 프로그램이 데이터 또는 프로그래밍 명령을 저장하는 데 사용하는 실제 메모리의 특정 위치(포인터라고도 함)를 참조하는 것 외에도, 주소를 사용하여 표시 창 식별자(핸들이라고도 함)를 참조할 수 있습니다. 사용하는 시스템(32비트/64비트)에 따라 포인터나 핸들의 크기(바이트 단위)가 결정됩니다.

64비트 버전 Office 2010과 함께 기존 솔루션을 실행하는 경우 발생하는 기본적인 두 가지 문제는 다음과 같습니다.

  • Office 2010의 네이티브 64비트 프로세스에서 32비트 바이너리를 로드할 수 없습니다. 기존에 사용하던 Microsoft ActiveX 컨트롤과 기존 추가 기능이 있는 경우 흔히 발생하는 문제입니다.

  • 이전에는 VBA에 포인터 데이터 형식이 없었으므로 개발자는 32비트 변수를 사용하여 포인터와 핸들을 저장했습니다. 이제는 이러한 변수가 Declare 문을 사용할 때 API 호출에 의해 반환되는 64비트 값을 자릅니다.

VBA 7 코드 베이스 소개

VBA 7은 이전 버전 VBA를 대체하는 새로운 코드 베이스로, Office 2010 32비트 및 64비트 버전 모두에서 사용할 수 있습니다. VBA 7은 두 조건부 컴파일 상수(VBA7 및 Win64)를 제공합니다. VBA7 상수는 응용 프로그램이 VBA 7을 사용하는지 아니면 이전 버전 VBA를 사용하는지를 테스트하여 코드의 이전 버전 호환성을 유지할 수 있도록 합니다. Win64 상수는 코드가 32비트로 실행되는지 아니면 64비트로 실행되는지를 테스트하는 데 사용됩니다. 이 두 컴파일 상수에 대해서는 이 문서 뒷부분에서 설명합니다.

이 문서의 다른 부분에 나와 있는 특정 예외 사항을 제외하면, 응용 프로그램의 32비트 버전을 사용하여 작동했던 문서(통합 문서와 프레젠테이션도 포함됨)의 매크로는 동일한 응용 프로그램의 64비트 버전에서 문서를 로드할 때도 작동합니다.

ActiveX 컨트롤 및 COM 추가 기능 호환성

기존 32비트 ActiveX 컨트롤(타사 컨트롤과 Microsoft 제공 컨트롤 모두 포함)은 64비트 버전 Office 2010과 호환되지 않습니다. ActiveX 컨트롤 및 COM 개체의 경우에는 다음과 같은 세 가지 해결 방법이 있습니다.

  • 소스 코드가 있으면 64비트 버전을 직접 생성할 수 있습니다.

  • 공급업체에 업데이트된 버전을 요청할 수 있습니다.

  • 다른 해결 방법을 검색할 수 있습니다.

Office 2010의 네이티브 64비트 프로세스는 32비트 바이너리를 로드할 수 없습니다. 여기에는 MSComCtl의 일반 컨트롤(TabStrip, Toolbar, StatusBar, ProgressBar, TreeView, ListViews, ImageList, Slider, ImageComboBox) 및 MSComCt2의 컨트롤(Animation, UpDown, MonthView, DateTimePicker, FlatScrollBar)이 포함됩니다. 이러한 컨트롤은 이전 버전 Microsoft Office를 통해 설치되었으며 Office 2010의 경우에도 32비트로 설치됩니다. 코드를 64비트 Office 2010으로 마이그레이션할 때는 이러한 컨트롤을 사용하는 기존 Microsoft Office VBA 솔루션 대신 사용할 수 있는 항목을 찾아야 합니다. 64비트 Office 2010에서는 64비트 버전 일반 컨트롤이 제공되지 않습니다.

응용 프로그래밍 인터페이스 호환성

VBA와 형식 라이브러리를 조합해 사용하면 Microsoft Office 응용 프로그램 작성을 위한 다양한 기능이 제공됩니다. 그러나 메모리 또는 프로세스를 관리할 때, 창/컨트롤 등의 사용자 인터페이스로 작업할 때, Windows 레지스트리를 수정할 때와 같이 컴퓨터 운영 체제 및 기타 구성 요소와 직접 통신해야 하는 경우가 있습니다. 이러한 경우에는 DLL(동적 연결 라이브러리) 파일에 포함된 외부 함수 중 하나를 사용하는 것이 가장 효율적입니다. 이렇게 하려면 VBA에서 Declare 문을 사용하여 API 호출을 수행합니다.

참고

Microsoft에서는 1,500개의 Declare 문과, 코드에 포함하려는 Declare 문을 잘라내서 붙여 넣을 수 있는 도구가 포함된 Win32API.txt 파일을 제공합니다. 그러나 이러한 문은 32비트 시스템용이므로 이 문서 뒷부분에서 설명하는 정보를 참고하여 64비트로 변환해야 합니다. 기존 Declare 문은 PtrSafe 특성을 사용하여 64비트에서 사용해도 안전한 것으로 표시한 경우가 아니면 64비트 VBA에서 컴파일되지 않습니다. 이러한 변환 유형의 예제는 Excel MVP인 Jan Karel Pieterse의 웹 사이트 http://www.jkp-ads.com/articles/apideclarations.asp에서 확인할 수 있습니다.

Office Code Compatibility Inspector 사용자 가이드는 필요한 경우 PtrSafe 특성에 대한 API Declare 문의 구문 및 적절한 반환 형식을 검사하는 데 참조할 수 있는 유용한 도구입니다.

반환 값이 없는 서브루틴을 호출하는지, 아니면 반환 값이 있는 함수를 호출하는지에 따라 Declare 문은 다음 중 하나와 같습니다.

Public/Private Declare Sub SubName Lib "LibName" Alias "AliasName" (argument list)
Public/Private Declare Function FunctionName Lib "Libname" alias "aliasname" (argument list) As Type

SubName 함수 또는 FunctionName 함수는 DLL 파일에서 실제 프로시저 이름으로 바뀌며, VBA 코드에서 프로시저를 호출할 때 사용되는 이름을 나타냅니다. 원하는 경우에는 프로시저 이름에 대해 AliasName 인수를 지정할 수도 있습니다. 호출 대상 프로시저가 포함된 DLL 파일의 이름은 Lib 키워드를 따릅니다. 마지막으로, 인수 목록에는 프로시저로 전달해야 하는 데이터 형식 및 매개 변수가 포함됩니다.

다음 Declare 문은 Windows 레지스트리에서 하위 키를 열어 해당 값을 바꿉니다.

Declare Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As Long, ByVal SubKey As String, NewKey As Long) As Long

RegOpenKeyA 함수의 Windows.h(창 핸들) 항목은 다음과 같습니다.

LONG RegOpenKeyA ( HKEY hKey, LPCSTR lpSubKey, HKEY *phkResult );

Microsoft Visual C 및 Microsoft Visual C++의 경우에는 위의 예제가 32비트와 64비트에서 모두 정상적으로 컴파일됩니다. HKEY가 포인터로 정의되며, 해당 크기는 코드가 컴파일되는 플랫폼의 메모리 크기를 반영하기 때문입니다.

이전 버전 VBA에서는 특정한 포인터 데이터 형식이 없었으므로 Long 데이터 형식이 사용되었습니다. 그리고 Long 데이터 형식은 항상 32비트이기 때문에 메모리가 64비트인 시스템에서 사용하는 경우 손상됩니다. 64비트 중 상위 32비트가 잘리거나 다른 메모리 주소를 덮어쓸 수 있기 때문입니다. 둘 중 어떤 경우에 해당하든, 예기치 않은 동작이 발생하거나 시스템 작동이 중단될 수 있습니다.

이 문제를 해결하기 위해 이제 VBA에는 완전한 포인터 데이터 형식인 LongPtr이 포함되어 있습니다. 이 새로운 데이터 형식을 사용하면 원래 Declare 문을 다음과 같이 올바르게 작성할 수 있습니다.

Declare PtrSafe Function RegOpenKeyA Lib "advapire32.dll" (ByVal hKey as LongPtr, ByVal lpSubKey As String, phkResult As LongPtr) As Long

이 데이터 형식과 새 PtrSafe 특성은 32비트 또는 64비트 시스템에서 이 Declare 문을 사용할 수 있도록 합니다. PtrSafe 특성은 64비트 버전 Office 2010에 대해 Declare 문의 대상으로 지정되는 VBA 컴파일러를 나타냅니다. 이 특성을 포함하지 않고 64비트 시스템에서 Declare 문을 사용하면 컴파일 시간 오류가 발생합니다. 32비트 버전 Office 2010에서는 필요한 경우에만 PtrSafe 특성을 사용하면 됩니다. 따라서 기존 Declare 문도 계속 정상적으로 작동합니다.

아래 표에는 앞서 설명한 새 한정자 및 데이터 형식과 다른 데이터 형식, 두 변환 연산자 및 세 함수에 대한 자세한 정보가 나와 있습니다.

형식

항목

설명

한정자

PtrSafe

Declare 문이 64비트와 호환됨을 나타냅니다. 64비트 시스템에서는 이 특성을 반드시 사용해야 합니다.

데이터 형식

LongPtr

32비트 버전에서는 4바이트 데이터 형식이고 64비트 버전 Office 2010에서는 8바이트 데이터 형식인 변수 데이터 형식입니다. 새로운 코드에 대해 포인터나 핸들을 선언할 때는 이 항목을 사용하는 것이 좋으며, 레거시 코드를 64비트 버전 Office 2010에서 실행해야 하는 경우에도 이 항목을 사용해야 합니다. 32비트 및 64비트의 VBA 7 런타임에서만 지원됩니다. 숫자 값을 지정할 수는 있지만 숫자 형식을 지정할 수는 없습니다.

데이터 형식

LongLong

64비트 버전 Office 2010에서만 사용 가능한 8바이트 데이터 형식입니다. 숫자 값을 지정할 수는 있지만 잘림을 방지하기 위해 숫자 형식은 지정할 수 없습니다.

변환 연산자

CLngPtr

단순 식을 LongPtr 데이터 형식으로 변환합니다.

변환 연산자

CLngLng

단순 식을 LongLong 데이터 형식으로 변환합니다.

함수

VarPtr

변형 변환기로, 64비트 버전에서는 LongPtr을 반환하고 32비트 버전(4바이트)에서는 Long을 반환합니다.

함수

ObjPtr

개체 변환기로, 64비트 버전에서는 LongPtr을 반환하고 32비트 버전(4바이트)에서는 Long을 반환합니다.

함수

StrPtr

문자열 변환기로, 64비트 버전에서는 LongPtr을 반환하고 32비트 버전(4바이트)에서는 Long을 반환합니다.

아래 예제에서는 이러한 항목 중 일부를 Declare 문에서 사용하는 방법을 보여 줍니다.

Declare PtrSafe Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As LongPtr, ByVal SubKey As String, NewKey As LongPtr) As Long

PtrSafe 특성이 없는 Declare 문은 64비트 버전 Office 2010과 호환되지 않는 것으로 간주됩니다.

앞서 설명한 것처럼 두 조건부 컴파일 상수(VBA7 및 Win64)가 새롭게 제공됩니다. 이전 버전 Microsoft Office와의 호환성을 유지하려면 VBA7 상수(일반적인 경우)를 사용하여 이전 버전 Microsoft Office에서 64비트 코드가 사용되지 않도록 합니다. 64비트 버전에는 LongLong을 사용하고 32비트 버전에는 Long을 사용하는 수학 API를 호출하는 코드와 같이 32비트 버전과 64비트 버전이 서로 다른 코드의 경우에는 Win64 상수를 사용합니다. 다음 코드에서는 이러한 두 상수를 사용하는 방법을 보여 줍니다.

#if Win64 then
   Declare PtrSafe Function MyMathFunc Lib "User32" (ByVal N As LongLong) As LongLong
#else
   Declare Function MyMathFunc Lib "User32" (ByVal N As Long) As Long
#end if
#if VBA7 then
   Declare PtrSafe Sub MessageBeep Lib "User32" (ByVal N AS Long)
#else
   Declare Sub MessageBeep Lib "User32" (ByVal N AS Long)
#end if

요약하자면, 64비트 코드를 작성하여 이전 버전 Microsoft Office에서 사용하려는 경우 VBA7 조건부 컴파일 상수를 사용합니다. 그러나 Office 2010에서 32비트 코드를 작성하는 경우에는 컴파일 상수가 없어도 해당 코드를 이전 버전 Microsoft Office에서 그대로 사용할 수 있습니다. 32비트 버전에는 32비트 문을, 64비트 버전에는 64비트 문을 사용하려는 경우에는 Win64 조건부 컴파일 상수를 사용하는 것이 가장 효율적입니다.

조건부 컴파일 특성 사용

다음 코드는 업데이트해야 하는 레거시 VBA 코드의 예제입니다. 이 레거시 코드의 데이터 형식은 핸들이나 포인터를 참조하므로, LongPtr을 사용하도록 업데이트됩니다.

레거시 VBA 코드

Declare Function SHBrowseForFolder Lib "shell32.dll" _
  Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long
  
Public Type BROWSEINFO
  hOwner As Long
  pidlRoot As Long
  pszDisplayName As String
  lpszTitle As String
  ulFlags As Long
  lpfn As Long
  lParam As Long
  iImage As Long
End Type

새 VBA 코드

#if VBA7 then    ' VBA7 
Declare PtrSafe Function SHBrowseForFolder Lib "shell32.dll" _
  Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long

Public Type BROWSEINFO
  hOwner As LongPtr
  pidlRoot As Long
  pszDisplayName As String
  lpszTitle As String
  ulFlags As Long
  lpfn As LongPtr
  lParam As LongPtr
  iImage As Long
End Type
 
#else    ' Downlevel when using previous version of VBA7

Declare Function SHBrowseForFolder Lib "shell32.dll" _
  Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long

Public Type BROWSEINFO
  hOwner As Long
  pidlRoot As Long
  pszDisplayName As String
  lpszTitle As String
  ulFlags As Long
  lpfn As Long
  lParam As Long
  iImage As Long
End Type
 
#end if
Sub TestSHBrowseForFolder ()
    Dim bInfo As BROWSEINFO
    Dim pidList As Long

    bInfo.pidlRoot = 0&
    bInfo.ulFlags = &H1
    pidList = SHBrowseForFolder(bInfo)
End Sub

질문과 대답

아래에는 32비트 버전 및 64비트 버전 Microsoft Office와 관련된 질문과 대답이 나와 있습니다.

  • 어떤 경우에 64비트 버전 Microsoft Office를 사용해야 합니까?
    사용 중인 호스트 응용 프로그램(Excel, Word 등)에 따라 다릅니다. 예를 들어 Excel의 경우 64비트 버전 Microsoft Office에서는 이전 버전보다 훨씬 큰 워크시트를 처리할 수 있습니다.

  • 64비트 및 32비트 버전 Microsoft Office를 병렬로 설치할 수 있습니까?
    아니요.

  • Long 매개 변수를 LongPtr로 변환해야 하는 경우는 언제입니까?
    Microsoft 개발자 네트워크의 Windows API 설명서에서 호출하려는 함수를 확인해야 합니다. 핸들과 포인터는 LongPtr로 변환해야 합니다. 예를 들어 RegOpenKeyA의 설명서에서는 다음 서명이 제공됩니다.

    LONG WINAPI RegOpenKeyEx(
      __in        HKEY hKey,
      __in_opt    LPCTSTR lpSubKey,
      __reserved  DWORD ulOptions,
      __in        REGSAM samDesired,
      __out       PHKEY phkResult
    );
    

    매개 변수는 다음과 같이 정의됩니다.

    매개 변수

    설명

    hKey [in]

    열려 있는 레지스트리 키에 대한 핸들입니다.

    lpSubKey [in, optional]

    열려는 레지스트리 하위 키의 이름입니다.

    ulOptions

    예약된 매개 변수로 값이 0이어야 합니다.

    samDesired [in]

    키에 대해 원하는 액세스 권한을 지정하는 마스크입니다.

    phkResult [out]

    열린 키에 대한 핸들을 받는 변수를 가리키는 포인터입니다.

    Win32API_PtrSafe.txt에는 Declare 문이 다음과 같이 정의되어 있습니다.

    Declare PtrSafe Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As LongPtr, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As LongPtr) As Long
    
  • 포인터와 핸들은 구조를 유지하여 변환해야 합니까?
    예. Win32API_PtrSafe.txt의 MSG 형식을 참조하십시오.

    Type MSG
        hwnd As LongPtr
        message As Long
        wParam As LongPtr
        lParam As LongPtr
        time As Long
        pt As POINTAPI
    End TypeF
    
  • strptr, varpt 및 objptr은 어떤 경우에 사용해야 합니까?
    이러한 함수는 각각 문자열, 변수 및 개체에 대한 포인터를 검색할 때 사용해야 합니다. 64비트 버전 Microsoft Office에서 이러한 함수는 64비트 LongPtr을 반환하며, 이 항목은 Declare 문으로 전달할 수 있습니다. 이러한 함수의 사용법은 이전 버전 VBA에서 변경되지 않았으며, 이제 함수가 LongPtr을 반환한다는 점만 달라졌습니다.

결론

64비트 버전 Office 2010이 추가됨에 따라 기능이 향상되어 더 많은 데이터를 이동할 수 있게 되었습니다. 32비트 코드를 작성할 때는 64비트 버전 Microsoft Office를 사용할 수 있으며 별다른 변경이 필요하지 않습니다. 그러나 64비트 코드를 작성할 때는 해당 코드가 이전 버전 Microsoft Office와 호환되도록 특정 키워드 및 조건부 컴파일 상수를 포함해야 하며, 32비트와 64비트 코드를 혼합 사용할 때는 올바른 코드가 실행되도록 해야 합니다.

추가 자료

Declare 문에 대한 자세한 내용은 다음 자료를 참조하십시오.