이 VARIANT 인스턴스의 값을 어떻게 표시하고 TStringLi에 저장할 수 있습니까? 성?
는 COM VARIANT
구조체는 SAFEARRAY
에 대한 포인터 parray
및 pparray
데이터 구성원, 예를 가지고
VARIANT V;
LPSAFEARRAY sa = V_ISBYREF(&V) ? V_ARRAYREF(&V) : V_ARRAY(&V);
은 VCL
Variant
클래스, 한편,
LPSAFEARRAY
변환 연산자를 가지고
정의되었으므로 직접 할당 할 수 있습니다 (예 : varByRef
플래그가없는 Variant.VType
필드 인 경우에만 해당). 예 :
당신이
SAFEARRAY
포인터를 일단
Variant V;
LPSAFEARRAY sa = V;
어느 쪽이든의 BSTR
값에 액세스 할 수 SafeArray는 API를 사용하여, 예를 들면 :
bool __fastcall VariantToStrings(const Variant &V, TStrings *List)
{
// make sure the Variant is holding an array
if (!V_ISARRAY(&V)) return false;
// get the array pointer
LPSAFEARRAY sa = V_ISBYREF(&V) ? V_ARRAYREF(&V) : V_ARRAY(&V);
// make sure the array is holding BSTR values
VARTYPE vt;
if (FAILED(SafeArrayGetVartype(sa, &vt))) return false;
if (vt != VT_BSTR) return false;
// make sure the array has only 1 dimension
if (SafeArrayGetDim(sa) != 1) return false;
// get the bounds of the array's sole dimension
LONG lBound = -1, uBound = -1;
if (FAILED(SafeArrayGetLBound(sa, 0, &lBound))) return false;
if (FAILED(SafeArrayGetUBound(sa, 0, &uBound))) return false;
if ((lBound > -1) && (uBound > -1))
{
// access the raw data of the array
BSTR *values = NULL;
if (FAILED(SafeArrayAccessData(sa, (void**)&values))) return false;
try
{
List->BeginUpdate();
try
{
// loop through the array adding the elements to the list
for (LONG idx = lBound; l <= uBound; ++idx)
{
String s;
if (values[idx] != NULL)
s = String(values[idx], SysStringLen(values[idx]));
List->Add(s);
}
}
__finally
{
List->EndUpdate();
}
}
__finally
{
// unaccess the raw data of the array
SafeArrayUnaccessData(sa);
}
}
return true;
}
VarClear (V); TVarData (V) .VType = varOleStr;
전혀 필요하지 않습니다. VCL Variant
클래스는 자신을 빈 상태로 초기화하므로 을 할당 할 필요가 없습니다. 이후에 즉시 Variant
전체에 새 값을 할당 할 것이기 때문입니다.
V = ComFunction-> GetValues (); V는 다음 GetValues()
로 시작하는 빈 Variant
을 반환, 비어있는 경우 // < < < < ----- V는
비어 있습니다.
mystr = (wchar_t *) (TVarData (V) .VString);
TVarData::VString
는 AnsiString&
참조 아닌 wchar_t*
포인터이다. String
에 VCL Variant
(안 COM VARIANT
를) 변환하려면, 단지 RTL 당신을위한 내용을 작품 그대로를 할당하고 보자
String mystr = V;