如何显示此 VARIANT 实例的值并将其保存在 TStringList 中?
COMVARIANT
结构具有指向 a 的指针parray
和pparray
数据成员SAFEARRAY
,例如:
VARIANT V;
LPSAFEARRAY sa = V_ISBYREF(&V) ? V_ARRAYREF(&V) : V_ARRAY(&V);
Variant
另一方面,VCL类LPSAFEARRAY
定义了转换运算符,因此您可以直接分配它(但Variant.VType
前提是不存在varByRef
标志的字段),例如:
Variant V;
LPSAFEARRAY sa = V;
无论哪种方式,一旦你有了SAFEARRAY
指针,就可以使用 SafeArray API 来访问这些BSTR
值,例如:
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;
}
变量清除(V);TVarData(V).VType = varOleStr;
你根本不需要那些。VCLVariant
类将自身初始化为空白状态,并且无需分配 ,因为您随后会立即VType
为整个分配一个新值。Variant
V = ComFunction->GetValues(); //<<<<----- V 为空
如果 V 为空,则GetValues()
返回一个空Variant
开始。
mystr = (wchar_t *)(TVarData(V).VString);
TVarData::VString
是AnsiString&
引用,而不是wchar_t*
指针。要将 VCL Variant
(不是 COM VARIANT
)转换为 a String
,只需按原样分配它,然后让 RTL 为您计算出细节:
String mystr = V;