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

Vla*_*sny 5 delphi activex binary-data

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

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

kob*_*bik 4

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

Dim arrData() As Byte
Run Code Online (Sandbox Code Playgroud)

VB6 应用程序应该将该变量作为OleVariant. 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;
Run Code Online (Sandbox Code Playgroud)

单位用途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;
Run Code Online (Sandbox Code Playgroud)

这是通过 COM 自动化将字节与二进制数据一起使用的最常见方法SAFEARRAY
将数据填充到BSTR(十六进制字符串、Base64 编码等)中对我来说听起来有点难看,而且看起来更像是一种 hack。

  • 可以将二进制数据放入“BSTR”而不对其进行编码。COM API 具有用于处理二进制“BSTR”的“SysAllocStringByteLen()”和“SysStringByteLen()”函数。这不是黑客攻击,但也不是常用的功能。不过,包含“VT_UI1”元素的“SAFEARRAY”是传递二进制数据的更好选择(“IStream”甚至更好)。 (2认同)