2012-02-13 7 views
5

Sto scrivendo un controllo ActiveX per il mio amico, che dovrebbe incapsulare le routine di crittografia. Sarà usato principalmente da VB6. Quale tipo di dati dovrei scegliere per i dati binari come la chiave di crittografia, il vettore di inizializzazione, i dati di input e di output in modo che sarebbe conveniente per il mio amico utilizzarlo da VB6?Quale tipo di dati è adatto per gestire dati binari nel metodo ActiveX?

Sto usando Delphi 7 per scrivere questo ActiveX, se questo è importante. Una scelta è quella di utilizzare stringhe esadecimali. Cosa può essere l'altro?

+0

Nella prima mano, ciò che il tuo * amico * stesso trova conveniente da usare? ;-) – OnTheFly

+0

@ user539484 Dice, stringhe esadecimali;) Ma sto ancora cercando una soluzione PIÙ conveniente;) –

+3

stringhe esadecimali, o codifica base64 ecc. Mi sembra una cattiva modifica. – kobik

risposta

4

VB6 Dati binari memorizzati in variabili e array Byte.

Dim arrData() As Byte 

VB6 Application dovrebbe passare la variabile al vostro Delphi COM come OleVariant. Delphi COM può convertire VarArray a TStream e viceversa:

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; 

Uso nell'unità 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; 

Questo è l'approccio più comune usare SAFEARRAY di byte di dati binari tramite Automazione COM
Il riempimento dei dati in un BSTR (stringhe esadecimali, codifica Base64, ecc.) Mi sembra un po 'brutto e sembra più un trucco.

+2

È possibile inserire dati binari in un 'BSTR' senza codificarlo. L'API COM ha funzioni 'SysAllocStringByteLen()' e 'SysStringByteLen()' per lavorare con 'BSTR's binari. Questo non è un trucco, ma non è una caratteristica comunemente usata. Un 'SAFEARRAY' contenente elementi' VT_UI1' è una scelta migliore per il passaggio di dati binari, tuttavia ('IStream' è ancora meglio). –

+0

@ RemyLebeau-TeamB, Grazie per le informazioni e la modifica :) Mi riferivo ad un hack per * codificare * il 'BSTR'. – kobik