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);
任何建议和意见将不胜感激. 解决方法
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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |