통상적인 WIN32에서는 BSTR도 WCHAR*입니다.
통상적으로 쓰는 WCHAR 문자열과 다른 점은, 첫문자 앞에 4바이트가 추가로 할당되어 문자열의 길이를 저장합니다.
문자열크기 (4바이트) | 첫번째 문자 (2바이트) | 두번째 문자 (2바이트) | 세번째 문자 (2바이트) | NULL (2바이트) |
|
|
|
이런 구조이구요, BSTR 자체는 WCHAR*로, 첫번째 문자의 주소를 가리키고 있는 포인터입니다.
보통 메모리를 할당하면, 가장 첫번째 요소의 주소를 가지고 핸들링 하는데,
BSTR은 약간 특이하게 문자열의 크기가 아니라 첫번째 문자의 포인터입니다.
그래서 C언어에서 사용할 때, 통상적인 WCHAR*과 비슷하게 사용할 수 있긴 하죠.
조금 헷갈릴 수 있는 게 C언어에서 메모리를 할당하거나 해제할 때는 가장 첫번째 요소의 포인터를 사용하는데,
BSTR 문자열을 할당하려면 할당한 메모리의 첫번째 주소에 4바이트를 더한 주소를 사용하셔야 하고,
BSTR 문자열을 해제하려면 주소에서 4바이트 빼서 해제 하셔야 하죠.
실제로는 직접 이렇게 하진 않고 SysAllocString이나 SysFreeString으로 이 과정을 대신합니다.
출처 :http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=738452&ref=738388
--------------------------------------------------------------------------------------------------------
ATL Library Reference
Programming with CComBSTR
The ATL class CComBSTR provides a wrapper around the BSTR data type. While CComBSTRis a useful tool, there are several situations that require caution.
--------------------------------------------------------------------------------------------------------
BSTR을 CString 으로 변환
: OLE2A 매크로나, WideCharToMultiByte 함수를 이용
MSXML에서는 대부분 return value가 _variant_t 타입이므로, W2T 같은 매크로를 사용하는게 좋다
ex)
USES_CONVERSION;
CString strText = W2T(_bstr_t(pNode->GetnodeValue()));
컴파일 에러시 #include <atlconv.h> 추가