'CopyMemory'에 해당되는 글 1건

Posted on 2011/09/28 00:51 Url http://www.svkor.com/blog/12
Filed Under 프로그래밍/Visual Basic



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]이 출력될 것이다.
2011/09/28 00:51 2011/09/28 00:51

About

by 축복

Counter

· Total
: 6446
· Today
: 8
· Yesterday
: 28