我正在爲我的朋友寫一個ActiveX控件,它應該封裝加密例程。它將主要用於VB6。我應該選擇哪種數據類型作爲加密密鑰,初始化向量,輸入和輸出數據等二進制數據,以便我的朋友在VB6中使用它時很方便?什麼數據類型適合在ActiveX方法中處理二進制數據?
我正在使用Delphi 7編寫此ActiveX,如果有問題。一種選擇是使用十六進制字符串。其他可以是什麼?
我正在爲我的朋友寫一個ActiveX控件,它應該封裝加密例程。它將主要用於VB6。我應該選擇哪種數據類型作爲加密密鑰,初始化向量,輸入和輸出數據等二進制數據,以便我的朋友在VB6中使用它時很方便?什麼數據類型適合在ActiveX方法中處理二進制數據?
我正在使用Delphi 7編寫此ActiveX,如果有問題。一種選擇是使用十六進制字符串。其他可以是什麼?
VB6存儲在字節變量和數組中的二進制數據。
Dim arrData() As Byte
VB6應用程序應該將該變量傳遞給您的Delphi COM作爲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;
在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;
這是通過使用具有二進制數據字節的SAFEARRAY
最常用的方法COM自動化。
填入數據到BSTR
(十六進制字符串,Base64編碼等..)聽起來有點醜陋,我似乎更像是一個黑客攻擊。
可以將二進制數據放入「BSTR」而不用編碼。 COM API具有用於處理二進制BSTR的'SysAllocStringByteLen()'和'SysStringByteLen()'函數。這不是破解,但它不是一個常用的功能。儘管('IStream'更好),包含'VT_UI1'元素的'SAFEARRAY'是傳遞二進制數據的更好選擇。 – 2012-02-15 01:47:40
@ RemyLebeau-TeamB,感謝您的信息和編輯:)我指的是*編碼* BSTR'黑客。 – kobik 2012-02-15 09:46:35
第一手,你的*朋友*自己發現方便使用? ;-) – OnTheFly 2012-02-13 19:10:14
@ user539484他說,十六進制字符串;)但我仍然在尋找更方便的解決方案;) – 2012-02-13 19:31:34
十六進制字符串或base64編碼等聽起來像一個可憐的黑客給我。 – kobik 2012-02-13 20:15:26