CopyMemory API는 함수명을 직역하면 "메모리 복사하기"이다.
해석처럼 메모리를 복사하는 기능을 한다.
다음 코드를 살펴보자.
'-- 배열 초기화 Dim Buf(9) As Byte Buf(0) = 10& Buf(1) = 11& Buf(2) = 12& Buf(3) = 13& Buf(4) = 14& Buf(5) = 15& Buf(6) = 16& Buf(7) = 17& Buf(8) = 18& Buf(9) = 19& '-- 복사될 배열 생성 및 영역 재할당 Dim Buf2() As Byte ReDim Buf2(UBound(Buf)) '-- 배열 복사 Dim i As Long For i = 0& To UBound(Buf) Buf2(i) = Buf(i) Next i
위의 코드는 단순히 배열을 복사하는 역할을 한다.
하지만, 위의 코드에서 배열을 복사하기 위해 영역 재할당을 하고, For문을 이용했다.
좀 복잡하지 않는가?
그럴때 필요한 것이 바로 CopyMemory API이다. (RtlMoveMemory 로도 사용이 가능하다.)
선언은 다음과 같이 한다.
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" ( _ ByRef Destination As Any, _ ByRef Source AsAny As Variant, _ ByVal Length As Long _ )
사용 방법은 Call CopyMemory(목적지변수, 소스변수, 복사길이) 와 같다.
목적지 변수와 소스 변수에는 어떤 것이든 올 수 있다.
그럼 위의 코드를 변환해보자.
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" ( _ ByRef Destination As Any, _ ByRef Source AsAny As Variant, _ ByVal Length As Long _ ) '-- 배열 초기화 Dim Buf(9) As Byte Buf(0) = 10& Buf(1) = 11& Buf(2) = 12& Buf(3) = 13& Buf(4) = 14& Buf(5) = 15& Buf(6) = 16& Buf(7) = 17& Buf(8) = 18& Buf(9) = 19& '-- 복사될 배열 생성 및 영역 재할당 Dim Buf2() As Byte ReDim Buf2(UBound(Buf)) Call CopyMemory(Buf2(0), Buf(0), UBound(Buf) + 1&)
복사하는 코드 4줄이 API 선언부와 호출부, 단 2줄로 압축되었다.
또한 For문을 사용하는것보다 속도도 빠르다.
또, CopyMemory 함수는 Byte 형과 Long 형끼리의 변환도 가능하다.
(참고: Long 형은 4Byte가 모여서 이루는 데이터 형)
다음 코드를 참고해보자.
'-- 4 Bytes To 1 Long Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" ( _ ByRef Destination As Any, _ ByRef Source AsAny As Variant, _ ByVal Length As Long _ ) '-- 배열 선언 및 할당, 변수 선언 Dim Buf(3) As Byte, Temp As Long Buf(0) = 0& Buf(1) = 4& Buf(2) = 0& Buf(3) = 0& Call CopyMemory(Temp, Buf(0), 4&) MsgBox Temp
결과는 [1024]가 출력될 것이다.
'-- 1 Long To 4 Bytes Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" ( _ ByRef Destination As Any, _ ByRef Source AsAny As Variant, _ ByVal Length As Long _ ) '-- 배열 선언 및 할당, 변수 선언 Dim Buf(3) As Byte, Temp As Long Temp = 1024& Call CopyMemory(Buf(0), Temp, 4&) MsgBox Buf(0) & " " & Buf(1) & " " & Buf(2) & " " & Buf(3)
결과는 [0 4 0 0]이 출력될 것이다.
