2012-05-23 5 views
1

BSTR (래퍼 클래스로 _bstr_t 사용)을 만들 때 constructors of _bstr_t 중 일부를 사용해야합니다. BSTR은 널 문자를 포함 할 수있는 길이가 접두사가 붙은 문자열이기 때문에 주어진 네이티브 문자열의 null 종결에 의존하지 않고 원래 문자열을 사용하여 그러한 문자열을 만들 수 있어야합니다.네이티브 문자열로 BSTR (_bstr_t 래퍼 사용)을 만들 때 길이를 어떻게 설정할 수 있습니까?

wchar_t* pwNativeString = L"abc\0def\0\0ghi\0\0\0"; // + automatic "\0" 

// Now I want to create a BSTR using _bstr_t by this string. 
_bstr_t spBSTR = _bstr_t(pwNativeString); 

문제는 생성자가 pwNativeString의 널 종료에 의존한다는 것입니다 :

는 예제를 제공합니다. 결과적으로 BSTR은 단지 "abc"이고 그 이상은 아닙니다. 그래서 내 질문은 : BSTR 또는 _bstr_t을 만들고 특정 길이의 배열에 대한 포인터를 전달하는 방법은 무엇입니까? 다음 의사 코드 예제에서 :

_bstr_t spBSTR = _bstr_t(pwNativeString, 15); 

답변

3

사용 SysAllocStringLenBSTR을 할당 한 다음에서 _bstr_t 객체를 생성하는 2 개의 인수를 _bstr_t 생성자를 사용합니다. 두 번째 매개 변수를 true으로 설정하면 SysFreeString 번으로 전화해야합니다. 그렇지 않은 경우 _bstr_t 개체가 문자열을 소유하고 있습니다.

BSTR bstrIn = SysAllocStringLen(L"abc\0def\0\0ghi\0\0\0", 15); 
_bstr_t spBSTR(bstrIn, false); 
+0

그런데 길이가 저장된 위치를 알고 계셨습니까? 문자 배열의 일부입니까? 그것은 구조입니까 아니면 그것입니까? –

+0

그런데 이것을 쉽게 사용하기 위해서 - 나는 누군가를 돕는다면이 매크로를 사용할 것이다 :'#define _bstr_t_create (str, len) _bstr_t (SysAllocStringLen (str, len), false)' –

+0

길이는 구현 - OS에 의해 결정된 정의 된 위치. 이것은 일반적으로 문자열의 첫 번째 문자 바로 앞의 네 바이트에 있지만,'SysStringLen'을 호출 할 수 있다고 가정하는 것이 아닙니다. –