2012-02-13 18 views
5

Arkadaşım için şifreleme rutinlerini kapsüllemesi gereken bir ActiveX denetimi yazıyorum. Öncelikle VB6'dan kullanılacaktır. Şifreleme anahtarı, ilklendirme vektörü, giriş ve çıkış verileri gibi ikili veri için hangi veri türünü seçmeliyim, böylece arkadaşım VB6'dan kullanmak için uygun olurdu?ActiveX yönteminde ikili veriyi işlemek için hangi veri türü uygundur?

Bu ActiveX'i yazmak için Delphi 7 kullanıyorum, eğer önemliyse. Bir seçenek onaltılık dizeleri kullanmaktır. Diğer ne olabilir?

+0

İlk olarak, * arkadaşınızın * kullanımı uygun bulduğu nedir? ;-) – OnTheFly

+0

@ user539484 O, altıgen dizeleri;) Ama hala daha uygun bir çözüm arıyorum;) –

+3

hex dizeleri, veya base64 kodlama vb bana kötü bir kesmek gibi geliyor. – kobik

cevap

4

VB6 Bayt değişkenleri ve dizilerde saklanan ikili veriler.

Dim arrData() As Byte 

VB6 Uygulama OleVariant olarak Delphi COM için o değişkeni geçmelidir. TStream ve yardımcısı VarArray dönüştürmek Delphi COM aynı şekilde:

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 biriminde Kullanım:

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

Bu aracılığıyla ikili veri ile bayt SAFEARRAY kullanmak için en çok kullanılan yöntem, COM otomasyonu.
Verilerin BSTR (Hex dizgileri, Base64 Kodlama vb.) Içine doldurulması bana çok çirkin geliyor ve daha çok bir kesmek gibi görünüyor.

+2

İkili verileri kodlamadan bir "BSTR" içine koymak mümkündür. COM API'sinde 'BSTR's ile çalışmak için SysAllocStringByteLen()' ve 'SysStringByteLen()' işlevleri bulunur. Bu bir hack değil, ama yaygın olarak kullanılan bir özellik değil. “VT_UI1” öğelerini içeren bir “SAFEARRAY”, ikili veriyi iletmek için daha iyi bir seçenek olsa da (IStream' daha da iyidir). –

+0

@ RemyLebeau-TeamB, Bilgi ve düzenleme için teşekkürler :) Bir şifrelemeyi * kodlama * 'BSTR' ile kastediyordum. – kobik

İlgili konular