gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:01:30 25 4
gpt4 key购买 nike

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

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

最佳答案

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

关于delphi - 什么数据类型适合在 ActiveX 方法中处理二进制数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9265884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com