この VARIANT インスタンスの値を表示して、TStringList 内に保存するにはどうすればよいですか?
COMVARIANT
構造体には、 へのポインタであるparray
およびpparray
データ メンバがありますSAFEARRAY
。たとえば、次のようになります。
VARIANT V;
LPSAFEARRAY sa = V_ISBYREF(&V) ? V_ARRAYREF(&V) : V_ARRAY(&V);
一方、 VCLVariant
クラスには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;
}
VarClear(V); TVarData(V).VType = varOleStr;
それらはまったく必要ありません。VCLクラスはそれ自体を空白の状態に初期化します。直後に全体に新しい値を割り当てるため、Variant
を割り当てる必要はありません。VType
Variant
V = ComFunction->GetValues(); //<<<<----- V は空です
V が空の場合、最初GetValues()
は空を返しVariant
ます。
mystr = (wchar_t *)(TVarData(V).VString);
TVarData::VString
ポインタではAnsiString&
なく参照です。wchar_t*
VCL Variant
( COM ではないVARIANT
)を に変換するString
には、そのまま割り当てて、RTL に詳細を任せます。
String mystr = V;