我正在开发一个 COM 对象库,其函数返回带有 SAFEARRAY
的 BSTR
的 VARIANT
。如何显示此 VARIANT
实例中的值并将其保存在 TStringList
中?我尝试在网上搜索没有明确的答案。
我尝试了以下方法但没有成功:
Variant V;
String mystr;
VarClear(V);
TVarData(V).VType = varOleStr;
V = ComFunction->GetValues(); //<<<<----- V is empty
mystr = (wchar_t *)(TVarData(V).VString);
Memo1->Lines->Add(mystr);
VarClear(V);
最佳答案
您可以使用TWideStringDynArray
并让Delphi进行转换:
procedure LoadStringsFromVariant(const Values: TWideStringDynArray; Strings: TStrings);
var
I: Integer;
begin
Strings.BeginUpdate;
try
for I := Low(Values) to High(Values) do
Strings.Add(Values[I]);
finally
Strings.EndUpdate;
end;
end;
当您使用 BSTR 的 Variant safearray 调用此函数时,它将自动转换为 TWideStringDynArray
。不兼容的 Variant 将导致运行时错误 EVariantInvalidArgError
。
要检查 Variant 是否拥有 BSTR 的安全数组,您可以执行以下操作:
IsOK := VarIsArray(V) and (VarArrayDimCount(V) = 1) and (VarType(V) and varTypeMask = varOleStr);
关于delphi - 如何使用 BSTR 的 SAFEARRAY 显示 VARIANT 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8558334/