개요
VBA6 또는 그 이전의 VBA는 암시적으로 32bit Windows를 타게팅하고 있다.
그리고 Declare문은 일반적으로 WIN API를 호출 할 때 32bit 데이터타입으로 가리키고(Point) 핸들링한다.
즉, VBA6 이하에는 포인터 또는 핸들에 대해 특정히 사용하는 데이터 타입이 없다. 다만 Long 데이터 타입(32bit - 4byte)을 사용한다.
문제는 VBA 레거시 코드로는 32bit 데이터타입으로 64bit를 사용하려함으로 메모리 overrun(초과)가 일어나고, crush 등이 발생한다는 것이다.
이를 방지하기 위해 LongPtr type alias, the LongLong data type, and the PtrSafe keyword가 추가되었다.
Keywords
LongPtr은 실행중인 Office 버전에 따라 결정된다. 32bit office에서는 Long, 64bit office에서는 LongLong으로 처리된다.
LongLong은 64bit Office에서만 사용가능한 64bit signed Integer다.
LongLong을 더 작은 정수 유형에 명시적으로 할당하려면 변환 함수를 사용해야한다.
PtrSafe 키워드는 Declare 문이 64 비트 버전의 Office에서 실행해도 안전하다는 것을 의미한다. (64bit에서는 해당 키워드를 항상 사용해야 한다.)
CLngPtr : LongPtr로 변환
CLngLng : LongLong으로 변환 (64bit에서만 유효)
vbLongLong : LongLong Integer (64bit에서만 유효)
^ : 리터럴 값을 LongLong 으로 명시적으로 선언, Long 값 보다 큰 LongLong 리터럴 을 선언하지 않으면 암시적으로 double로 변환 됨 )
VBA7
VBA7은 MS Office 2010에 등장했다. VBA7은 MS Office와 Windows 64비트 버전을 지원하기 위해 도입되었다. 따라서 큰 변화는 없다.
1. API 호출을 위한 전처리기
1. #If Win64 Then // x64 Windows
2. #If VBA7 Then // x64 MS Office
2. LongPtr(별칭으로 x64 Office에서는 LongLong을, x86 Office에서는 Long을 가리킴), LongLong, PtrSafe 등 추가
3. CLngLng()
4. 일부 함수 호출시 VBA를 생략했을 때 에러가 난다.
예시
#If VBA7 Then
Public Declare PtrSafe Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
'64비트/32비트 시스템에 따라 파라미터가 다른경우에는 아래구분에 서술합니다.
#If Win64 Then
#Else
#End If
#Else
'VBA6에는 32Bit 버전만 존재합니다.
Public Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
#End If
참고
https://docs.microsoft.com/ko-kr/previous-versions/office/ee691831(v=office.14) https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2010/ee691831(v=office.14)#odc_office2010_Compatibility32bit64bit_IntroducingVBA7CodeBase https://docs.microsoft.com/en-us/office/vba/language/concepts/getting-started/64-bit-visual-basic-for-applications-overview
2. 다운로드 받은 콘텐츠는 본인(본인회사)만 사용할 수 있습니다.
3. 다른 사람과 공유하거나 원본 또는 수정 후 무단전제,무단배포,무단판매,무단 공유할 수 없습니다.
4. 웹상에서 배포는 상업,비상업적 목적을 불문하고, 손해배상등 가중처벌됩니다.