【发布时间】:2020-05-01 00:32:41
【问题描述】:
我正在尝试将字节数组从 VBscript 传递到我的 windows Delphi 应用程序,但似乎找不到正确的语法来解释传递的数据。
需求非常简单,如下面的 VBscript sn-p 所示
Dim inst,arr(5)
Sub Main
set inst=instruments.Find("EP1")
arr(0) = 0
arr(1) = 1
arr(2) = 2
arr(3) = 3
arr(4) = 4
inst.writebytes arr,5
end Sub
我可以让服务器接受脚本传递的 olevariant 但数据似乎是乱码,我的示例服务器代码如下所示,基于此处的 Stackoverflow 问题How to use variant arrays in Delphi
procedure TInstrument.WriteBytes(Data: OleVariant; Length: Integer);
var i,n:integer; Pdat:Pbyte; Adata:PvarArray;
begin
if VarIsArray(data) then
begin
n:=TVarData(Data).VArray^.Bounds[0].ElementCount;
Adata:= VarArrayLock(Data);
Getmem(Pdat,length);
try
for i:=0 to length-1 do
Pdat[i]:=integerArray(Adata.data^)[i];
Finstrument.WriteBytes(Pdat,Length);
finally
freemem(Pdat)
end;
end;
end;
所以想法是接受脚本传递的整数,将其转换为本地数据表示(字节数组),然后将其传递给我的函数以使用数据。
我尝试了几种不同的数据类型和方法,试图从变体中获取一些无乱码的数据,但均无济于事。
从传递的变量中提取数组数据的正确方法是什么?
另外,TVarData(Data).VArray^.Bounds[0].ElementCount 的值为零,为什么会这样?
【问题讨论】:
-
1.您假设 VBScript 正在向您传递整数的变体数组,但它可能是变体的变体数组。 (检查
VarType(Data))。 2.您应该使用变体访问API:检查VarArrayDimCount(Data) = 1,然后使用for I := VarArrayLowBound(Data, 1) to VarArrayHighBound(Data, 1) do ... VarArrayGet(Data, [I]) -
谢谢,是的,帮助文件列出了 Variants 函数,但我很难找到有关如何使用它们的任何信息。它不直观。我会看看他们是否让我更进一步。