【问题标题】:How to use variant arrays in Delphi如何在 Delphi 中使用变体数组
【发布时间】:2011-04-06 21:25:48
【问题描述】:

我有两个 Delphi7 程序:一个 COM 自动化服务器 (EXE) 和另一个正在使用自动化服务器的程序。

我需要将一个字节数组从一个程序传递给另一个程序。

经过一番搜索,我发现使用变体数组是可行的方法(如果您知道更好的方法,请纠正我)。

我的问题是: 如何在一个程序中创建变量数组,然后如何在另一个程序中读取其值?

我知道 VarArrayCreate 和 VarArrayLowBound/VarArrayHighBound,但我不确定如何正确执行此操作。

谢谢!

【问题讨论】:

    标签: arrays delphi automation delphi-7 variant


    【解决方案1】:

    你这样创建它:

    先声明

    var
      VarArray: Variant;
      Value: Variant;
    

    然后是创作:

    VarArray := VarArrayCreate([0, Length - 1], varVariant);
    

    或者你也可以拥有

    VarArray := VarArrayCreate([0, Length - 1], varInteger);
    

    取决于数据的类型。然后你像这样迭代:

    i := VarArrayLowBound(VarArray, 1);
    HighBound := VarArrayHighBound(VarArray, 1);
    
    while i <= HighBound do
    begin
      Value := VarArray[i];
      ... do something ...
      Inc(i);
    end;
    

    最后,当您不再需要数组时,您可以清除它。编辑:(这是可选的,见In Delphi 2009 do I need to free variant arrays?

    VarClear(VarArray);
    

    这就是它的全部内容。另一个例子看官方Embracadero Help

    编辑:

    数组只能创建一次。然后就像上面的例子一样使用它。

    【讨论】:

    • 谢谢!您能否提供一些示例代码,说明如何在客户端读取数组?假设一个 vararray 在 Variant 中传递给客户端,你如何阅读它?你是调用 VarArrayCreate 还是只使用 VarArrayLowBound 等?
    • 只使用另一边的数组。只创建一次。但要注意谁负责清理它。
    • 清除和释放不是一回事
    • 从来没有说过这是一回事。我还提供了一个解释引用计数性质的 URL。
    【解决方案2】:

    另一边:

    (假设Value为Variant参数,元素类型为WideString)

    var
      Source: PWideStringArray;
    
    if VarIsArray(Value) then begin
      Source:= VarArrayLock(Value);
      try
        for i:= 0 to TVarData(Value).VArray^.Bounds[0].ElementCount - 1 do
          DoWhatEverYouWantWith(Source^[i]);
        end;
      finally
        VarArrayUnlock(Value);
      end;
    end;  
    

    【讨论】:

    • 什么是 VarArrayLock?顺便说一句,我正在使用字节数组。 PWideStringArray 在哪里定义?还有一个 PByteArray 吗?谢谢!
    • PWideStringArray 是一个自定义类型,顾名思义,是一个指向 WideStrings 数组的指针。您可以在 SysUtils 中找到 PByteArray。 VarArrayLock 锁定数组并返回指向包含该数组的内存的指针,以便更快地访问。由于您有不同的进程摆弄这个数组,我建议使用这个功能。您可以在 D7 帮助中查找更多信息。
    猜你喜欢
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 2011-08-21
    • 2015-06-14
    • 1970-01-01
    相关资源
    最近更新 更多