加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 04:13:16 所属栏目:大数据 来源:网络整理
导读:我正在为我的朋友编写一个ActiveX控件,它应该封装加密例程.它将主要用于VB6.我应该为二进制数据选择哪种数据类型,如加密密钥,初始化向量,输入和输出数据,这样我的朋友可以方便地从VB6使用它? 我正在使用Delphi 7来编写这个ActiveX,如果这很重要的话.一种选
我正在为我的朋友编写一个ActiveX控件,它应该封装加密例程.它将主要用于VB6.我应该为二进制数据选择哪种数据类型,如加密密钥,初始化向量,输入和输出数据,这样我的朋友可以方便地从VB6使用它?

我正在使用Delphi 7来编写这个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编码等…)听起来有点难看,看起来更像是一个黑客.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读