2012-02-13 150 views
5

我正在爲我的朋友寫一個ActiveX控件,它應該封裝加密例程。它將主要用於VB6。我應該選擇哪種數據類型作爲加密密鑰,初始化向量,輸入和輸出數據等二進制數據,以便我的朋友在VB6中使用它時很方便?什麼數據類型適合在ActiveX方法中處理二進制數據?

我正在使用Delphi 7編寫此ActiveX,如果有問題。一種選擇是使用十六進制字符串。其他可以是什麼?

+0

第一手,你的*朋友*自己發現方便使用? ;-) – OnTheFly 2012-02-13 19:10:14

+0

@ user539484他說,十六進制字符串;)但我仍然在尋找更方便的解決方案;) – 2012-02-13 19:31:34

+3

十六進制字符串或base64編碼等聽起來像一個可憐的黑客給我。 – kobik 2012-02-13 20:15:26

回答

4

VB6存儲在字節變量和數組中的二進制數據。

Dim arrData() As Byte 

VB6應用程序應該將該變量傳遞給您的Delphi COM作爲OleVariant。 Delphi的COM可以轉換VarArrayTStream,反之亦然:

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編碼等..)聽起來有點醜陋,我似乎更像是一個黑客攻擊。

+2

可以將二進制數據放入「BSTR」而不用編碼。 COM API具有用於處理二進制BSTR的'SysAllocStringByteLen()'和'SysStringByteLen()'函數。這不是破解,但它不是一個常用的功能。儘管('IStream'更好),包含'VT_UI1'元素的'SAFEARRAY'是傳遞二進制數據的更好選擇。 – 2012-02-15 01:47:40

+0

@ RemyLebeau-TeamB,感謝您的信息和編輯:)我指的是*編碼* BSTR'黑客。 – kobik 2012-02-15 09:46:35