2012-02-13 19 views
5

Estoy escribiendo un control ActiveX para mi amigo, que debe encapsular las rutinas de encriptación. Se usará desde VB6 principalmente. ¿Qué tipo de datos debo elegir para datos binarios, como la clave de cifrado, el vector de inicialización, los datos de entrada y salida para que sea conveniente para mi amigo usarlo desde VB6?¿Qué tipo de datos es adecuado para manejar datos binarios en el método ActiveX?

Estoy usando Delphi 7 para escribir este ActiveX, si eso es importante. Una opción es usar cadenas hexadecimales. ¿Cuál puede ser el otro?

+0

En la primera mano, ¿qué es lo que su * amigo * mismo encuentra conveniente de usar? ;-) – OnTheFly

+0

@ user539484 Él dice, cadenas hexagonales;) Pero todavía estoy buscando una solución MÁS conveniente;) –

+3

cadenas hexagonales, o la codificación base64 etc. suena como un truco pobre para mí. – kobik

Respuesta

4

VB6 Datos binarios almacenados en variables Byte y matrices.

Dim arrData() As Byte 

aplicación VB6 debe pasar esa variable a su Delphi COM como OleVariant. Delphi COM puede convertir VarArray a TStream y 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 en la unidad 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; 

Este es el enfoque más común el uso de SAFEARRAY de bytes con los datos binarios a través Automatización COM.
Rellenar los datos en un BSTR (Hex strings, Base64 Encoding etc ..) suena un poco feo para mí y parece más un hack.

+2

Es posible poner datos binarios en un 'BSTR' sin codificarlo. La API COM tiene funciones 'SysAllocStringByteLen()' y 'SysStringByteLen()' para trabajar con 'BSTR' binarios. Esto no es un truco, pero no es una característica comúnmente utilizada. Sin embargo, un 'SAFEARRAY' que contiene elementos' VT_UI1' es una mejor opción para pasar datos binarios ('IStream' es incluso mejor). –

+0

@ RemyLebeau-TeamB, gracias por la información y la edición :) Me refería a un truco mediante * codificación * del 'BSTR'. – kobik

Cuestiones relacionadas