如何使用SATREARRAY为BSTR的VARIANT显示值

Heb*_*Heb 8 delphi bstr c++builder safearray

我的工作与功能的COM对象库,它返回一个VARIANT带有SAFEARRAYBSTR秒.如何显示此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);
Run Code Online (Sandbox Code Playgroud)

Ond*_*lle 4

您可以使用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;
Run Code Online (Sandbox Code Playgroud)

当您使用 BSTR 的 Variant safearray 调用此函数时,它将自动转换为TWideStringDynArray。不兼容的变体将导致运行时错误EVariantInvalidArgError

要检查 Variant 是否拥有 BSTR 的安全数组,您可以执行以下操作:

IsOK := VarIsArray(V) and (VarArrayDimCount(V) = 1) and (VarType(V) and varTypeMask = varOleStr);
Run Code Online (Sandbox Code Playgroud)