2012-02-13 3 views
5

私は友人のためのActiveXコントロールを書いています。それは暗号化ルーチンをカプセル化する必要があります。主にVB6から使用されます。暗号化キー、初期化ベクトル、入出力データなどのバイナリデータに対して、どのようなデータ型を選択する必要があります。これは、私の友人がVB6から使用するのに便利でしょうか?ActiveXメソッドのバイナリデータを処理するのに適したデータ型は何ですか?

私はDelphi 7を使ってこのActiveXを書いています。 1つの選択肢は、16進文字列を使用することです。他の人は何ができますか?

+0

最初の手で、あなたの*友人が自分で使いやすいものを見つけましたか? ;-) – OnTheFly

+0

@ user539484彼は言う、16進文字列;)しかし、私はまだより便利な解決策を探しています;) –

+3

16進文字列、またはBase64エンコードなどは私に貧しいハックのように聞こえる。 – kobik

答えて

4

VB6バイト変数と配列に格納されたバイナリデータ。

Dim arrData() As Byte 

VB6アプリケーションは、その変数をOleVariantとしてDelphi COMに渡す必要があります。これは、を介してバイナリデータのバイトSAFEARRAYを使用する最も一般的なアプローチである

// 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; 

CoClass単位で

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; 

使用: デルファイCOMはVarArrayTStreamへ及びその逆に変換することができCOMオートメーション。
BSTR(16進数文字列、Base64エンコーディングなど)にデータを格納すると、ちょっと醜い音がして、ハックのように思えます。

+2

バイナリデータをエンコードせずに 'BSTR'に入れることは可能です。 COM APIには、バイナリ 'BSTR'を扱うための' SysAllocStringByteLen() 'と' SysStringByteLen() '関数があります。これはハックではありませんが、よく使われる機能ではありません。 '' IStream'はさらに優れていますが、 'VT_UI1'要素を含む' SAFEARRAY'はバイナリデータを渡すためのより良い選択です。 –

+0

@ RemyLebeau-TeamB、情報ありがとう、編集:)私は、BSTRを*エンコードすることでハックすることを指摘していました。 – kobik

関連する問題