[VB6.0] 내부함수 __vbaStrCopy

 

__vbaStrCopy 함수는 값을 복사해오는 함수로 보인다.

 

 

__vbaStrCopy

[int] __vbaStrCopy( BSTR* Source, BSTR* Destination );

This routine copies a BSTR from one memory location to another.

The Source BSTR is placed in EDX, the Destination BSTR is placed in ECX.

The return value is an integer in EAX which is a duplicate pointer to the Destination.

Code Example:

.text:00401961 mov edx, offset aString ; "STRING"

.text:00401966 lea ecx, [ebp-1Ch]

.text:00401969 mov [ebp-1Ch], esi

.text:0040196C call ds:__vbaStrCopy

.text:00401972 mov eax, [ebp-1Ch]

Explanation of code example:

You can see the string being moved into EDX and then a stack location into ECX. The copied string is then at both [ECX] and [EDX] and the return value in EAX is the same pointer as [ECX].

(c) 2004 Telos & SneakCharm

 

 

한글 번역

 

__vbaStrCopy

[int] __vbaStrCopy( BSTR* Source, BSTR* Destination );

이 루틴은 한 메모리 위치에서 다른 메모리 위치로 BSTR을 복사합니다.

Source BSTR은 EDX에 배치되고 Destination BSTR은 ECX에 배치됩니다.

반환 값은 목적지에 대한 중복 포인터인 EAX의 정수입니다.

코드 예제 :

.text:00401961 mov edx, offset aString ; "STRING"

.text:00401966 lea ecx, [ebp-1Ch]

.text:00401969 mov [ebp-1Ch], esi

.text:0040196C call ds:__vbaStrCopy

.text:00401972 mov eax, [ebp-1Ch]

코드 예제 설명 :

문자열이 EDX로 이동한 다음 스택 위치가 ECX로 이동하는 것을 볼 수 있습니다. 그러면 복사된 문자열은 [ECX]와 [EDX]에 모두 있으며 EAX의 반환 값은 [ECX]와 동일한 포인터입니다.

(c) 2004 Telos & SneakCharm

 

 

 

 

추가 ++)

BSTR에 대해... BSTR이란 무엇인가??

 

http://golbeng.egloos.com/86921

 

문자열을 표현하는 방법에는 다음과 같은 두가지 방법이 있다.

1. 일련의 문자들을 기록한 뒤, 맨 끝에 문자열의 끝을 나타내는 특별한 식별자를 기록한다.

2. 맨 앞에 문자열을 나타내는 총 바이트 수를 기록한 뒤, 일련의 문자들을 기록한다.

1번의 경우에 해당하는 대표적인 경우가 C/C++의 문자열이다.

C/C++에서는 문자열의 끝을 나타내기 위해 널(NULL) 문자를 사용한다.

2번의 경우에 해당하는 경우는 베이직이나 파스칼의 문자열이다.

우리가 다루고자 하는 BSTR도 바로 2번과 같은 형태를 가진 문자열이다.

자, BSTR에 대해 알아보자.

BSTR 타입은 마이크로소프트의 비주얼 베이직 개발팀에 의해 만들어 졌다.

비주얼 베이직은 포인터를 지원하지 못했기 때문에, 기존의 가상함수 테이블을 이용한

함수 호출이 불가능하였다. 이에 비주얼 베이직 개발팀은 IDispatch 인터페이스를

고안해 내었다. 비주얼 베이직과 COM 객체가 원활히 통신하기 위해서 COM에서 비주얼

베이직의 문자열 타입을 지원하게 되는 결과를 낳았는데, 그것이 바로 BSTR이다.

그래서, 이름이 BSTR(Basic STRing의 약자이다!)이기도 하다.

또한, BSTR는 COM에서 유니코드(Unicode) 문자열을 나타내는데 자주 사용된다.

비주얼 베이직(BSTR)는 개념적으로 2개의 필드로 구성된다.

첫번째 필드는 4바이트(unsigned long)로 구성되고, 실제 문자열의 총 바이트 수를 나타낸다.

(유니코드 문자들의 총 개수가 아니라, 바이트 수임에 명심하라!)

두번째 필드는 실제 문자열이며, NULL로 끝난다.

(다른 형식의 문자열과 호환성을 위해서 NULL로 끝나는 것 같다.)

(첫번째 필드에 기록된 총 바이트 수는 NULL 문자를 제외한 것임에 또한 명심하라!)

또한, 두번째 필드에 기록되는 문자들은 2바이트로 구성된다. 유니코드 문자이기 때문이다.

이렇듯 BSTR는 실질적으로 두 개의 필드로 구성되어 있다.

그러나, BSTR 타입은 표준 유니코드 문자 포인터에 지나지 않는다.

(실제로 BSTR 타입은 typedef OLECHAR __RPC_FAR* BSTR 로 정의되어 있다.

OLECHAR __RPC_FAR* 를 나타내는 타입인 것이다. OLECHAR은 결국 wchar_t의

다른 이름일 뿐이다.)

BSTR 포인터는 BSTR 타입 데이터의 두번째 필드, 즉 실제 문자열 부분을 가리킨다.

BSTR는 이렇게 정의되기 때문에 두 개의 필드로 구성됨을 알 필요없이,

보통의 유니코드 문자열과 똑같이 다룰 수 있는 것이다.

또한 BSTR 문자열은 COM에서 대표적으로 사용되는 유니코드 문자열이고,

COM은 다른 프로세스, 다른 컴퓨터 사이에서 사용될 수 있다.

그러므로 BSTR 문자열을 위한 메모리 할당/해제를 위해서 언어 종속적인

기능(new/delete, malloc/free ...)을 사용해서는 안된다.

COM이 제공하는 메모리 할당기로부터 할당/해제되어야 한다.

COM의 메모리 할당기를 사용하면서, 사용하기 편하게 하기 위해서

COM은 BSTR 문자열에 관한 API들을 제공한다.

SysAllocString(), SysFreeString(), SysReAllocString, SysStringLen()가 같이

"Sys.."로 시작하는 함수들이 그러한 COM이 제공하는 API 함수이다.

 

 

 

참고 : 

https://blog.naver.com/huangha/221738850374

+ Recent posts