2014-03-03 3 views
2

BSTR의 safearray를 반환하는 호출이 있습니다. vector<LPOLESTR>에 복사하고 싶습니다. 올바른 방법은 무엇입니까? 이 경우 메모리가 어떻게 처리됩니까?safearray에서 벡터로 값을 복사하는 방법은 무엇입니까?

+1

벡터의 포인터가 모두 가리키는 메모리를 어떻게 할당하고 관리 할 계획입니까? safearray는 BSTR을 소유하고 있으며 자체가 파괴 될 때 할당을 해제합니다. '벡터 ', 또는 MFC 나 ATL을 사용하고 있다면'벡터 '으로 더 행복 할 것입니다. –

+0

나는 비슷한 라인을 생각하고 있었다. 마침내 벡터 와 함께 가기로 결정했다. 내용을 복사하는 알고리즘은 무엇입니까? – User234

답변

2

이 같은 의견에 대한 논의 당, 당신은 결국 vector<wstring>을 원하는 뭔가를 가정 :

SAFEARRAY* sa; // a safearray of BSTR, initialized somehow. 

LONG lBound, uBound; 
SafeArrayGetLBound(sa, 1, &lBound); 
SafeArrayGetUBound(sa, 1, &uBound); 
LONG count = uBound - lBound + 1; // bounds are inclusive 

BSTR* raw; 
SafeArrayAccessData(sa, (void**)&raw); 

vector<wstring> v(raw, raw + count); 
// or, if you want to assign to an existing vector 
vector<wstring> v; 
v.assign(raw, raw + count); 

// When no longer need "raw". 
SafeArrayUnaccessData(sa); 

오류 처리는 독자들에게 운동으로 남아 있습니다.

관련 문제