什么数据类型适合在ActiveX方法中处理二进制数据?

时间:2012-02-13 18:31:29

标签: delphi activex binary-data

我正在为我的朋友编写一个ActiveX控件,它应该封装加密例程。它将主要用于VB6。我应该为二进制数据选择哪种数据类型,如加密密钥,初始化向量,输入和输出数据,这样我的朋友可以方便地从VB6中使用它?

我正在使用Delphi 7来编写这个ActiveX,如果这很重要的话。一种选择是使用十六进制字符串。另一个可以是什么?

1 个答案:

答案 0 :(得分:4)

VB6二进制数据存储在字节变量和数组中。

Dim arrData() As Byte

VB6应用程序应该将该变量作为OleVariant传递给Delphi COM。 Delphi COM可以将VarArray转换为TStream,反之亦然:

procedure VariantToStream(const v :OleVariant; Stream: TStream);
var
  p : pointer;
  lo, hi, size: Integer;
begin
  lo := VarArrayLowBound(v,  1);
  hi := VarArrayHighBound (v, 1);
  if (lo >= 0) and (hi >= 0) then
  begin
    size := hi - lo + 1;
    p := VarArrayLock (v);
    try
      Stream.WriteBuffer (p^, size);
    finally
      VarArrayUnlock (v);
    end;
  end;
end;

procedure StreamToVariant(Stream: TStream; var v: OleVariant);
var
  p : pointer;
  size: Integer;
begin
  size := Stream.Size - Stream.Position;
  v := VarArrayCreate ([0, size - 1], varByte);
  if size > 0 then
  begin
    p := VarArrayLock (v);
    try
      Stream.ReadBuffer (p^, size);
    finally
      VarArrayUnlock (v);
    end;
  end;
end;

CoClass单位的用法:

// HRESULT _stdcall BinaryTest([in] VARIANT BinIn, [out, retval] VARIANT * BinOut );
function TMyComClass.BinaryTest(BinIn: OleVariant): OleVariant; safecall;
var
  Stream: TMemoryStream;
begin
  Stream := TMemoryStream.Create;
  try
    VariantToStream(BinIn, Stream);
    Stream.Position := 0;

    // do something with Stream ...

    // ... and return some Binary data to caller (* BinOut)
    Stream.Position := 0;
    StreamToVariant(Stream, Result);
  finally
    Stream.Free;
  end;
end;

这是通过COM自动化将SAFEARRAY字节与二进制数据一起使用的最常用方法 将数据填充到BSTR(十六进制字符串,Base64编码等...)声音对我来说有点难看,看起来更像是一个黑客。