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



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

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

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

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编码等)中对我来说听起来有点难看,更像是一种破解。

相关内容

  • 没有找到相关文章

最新更新