加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi OleVariant来自COM库的字符串数组

发布时间:2020-12-15 09:30:29 所属栏目:大数据 来源:网络整理
导读:我有Delphi 2006客户端应用程序.此客户端从COM服务器接收Olevariant类型数据.功能是: procedure OnLimitsChanged(var SymbolsChanged: {??PSafeArray}OleVariant); 此函数返回一个字符串数组.我无法从delphi中读取OleVariant类型的数据. 从Excel VBA开始工
我有Delphi 2006客户端应用程序.此客户端从COM服务器接收Olevariant类型数据.功能是:

procedure OnLimitsChanged(var SymbolsChanged: {??PSafeArray}OleVariant);

此函数返回一个字符串数组.我无法从delphi中读取OleVariant类型的数据.

从Excel VBA开始工作:

Private Sub g_Realtime_OnLimitsChanged(SymbolsChanged() As String)
    Dim i%
    Dim Salir As Boolean
    If UBound(SymbolsChanged) <> -1 Then
        i = 0: Salir = False
        While Not Salir
            If SymbolsChanged(i) = Simbolo Then
                LlamarALimites
                Salir = True
            Else
                i = i + 1
                If i > UBound(SymbolsChanged) Then Salir = True
            End If
        Wend
    End If
End Sub

我试图将OleVariant转换为Psafearray ……

procedure TfmConfiguracion.RecibirNuevosTicks(ASender: TObject;
  var ArrayTicks : Olevariant);    
var 
  Data : pSafeArray;
  i,iLow,iHigh : Integer;  
  value : wideString;
begin
  Data:=PSafeArray(TVarData(ArrayTicks).VArray);
  SafeArrayGetLBound(Data,1,iLow);
  SafeArrayGetUBound(Data,iHigh);
  for i:=iLow to iHigh do
  begin
    SafeArrayGetElement(Data,i,Value);
    Showmessage(Value);
  end;

但我收到的除此之外:

SafeArrayGetLBound(Data,iLow);

Debugger Fault Notification
Project … faulted with message: ‘ access violation at 0x751de18c: read of address 0xabababab’. Process Stopper. Use Step or Run to continue

任何建议和意见将不胜感激.

解决方法

RTL有一个VarArrayAsPSafeArray()函数,用于从(Ole)Variant中正确提取PSafeArray:

procedure TfmConfiguracion.RecibirNuevosTicks(ASender: TObject; var ArrayTicks : OleVariant);    
var 
  Data : PVarArray; // RTL's version of PSafeArray
  //...
begin
  Data := VarArrayAsPSafeArray(ArrayTicks);
  //...
end;

如果(Ole)Variant不包含数组,则会引发异常.或者您可以使用VarIsArray()手动检查它:

procedure TfmConfiguracion.RecibirNuevosTicks(ASender: TObject; var ArrayTicks : OleVariant);    
var 
  Data : PVarArray;
  //...
begin
  if not VarIsArray(ArrayTicks) then Exit;
  Data := VarArrayAsPSafeArray(ArrayTicks);
  //...
end;

话虽这么说,(Ole)Variant内置支持访问PSafeArray元素数据,所以你不需要直接访问PSafeArray(除非你想要额外的性能提升,在这种情况下你需要验证PSafeArray在您访问其数据之前自己):

procedure TfmConfiguracion.RecibirNuevosTicks(ASender: TObject; var ArrayTicks : Olevariant);    
var 
  i : Integer;  
  value : String;
begin
  if not VarIsArray(ArrayTicks) then Exit;
  for i := VarArrayLowBound(ArrayTicks,1) to VarArrayHighBound(ArrayTicks,1) do
  begin
    Value := ArrayTicks[i];
    ShowMessage(Value);
  end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读