2012-02-13 8 views
5

मैं अपने दोस्त के लिए एक ActiveX नियंत्रण लिख रहा हूं, जो एन्क्रिप्शन दिनचर्या को समाहित करना चाहिए। इसका मुख्य रूप से वीबी 6 से उपयोग किया जाएगा। एन्क्रिप्शन कुंजी, प्रारंभिक वेक्टर, इनपुट और आउटपुट डेटा जैसे बाइनरी डेटा के लिए मुझे किस डेटा प्रकार का चयन करना चाहिए ताकि मेरे दोस्त के लिए इसे VB6 से उपयोग करना सुविधाजनक हो?ActiveX विधि में बाइनरी डेटा को संभालने के लिए कौन सा डेटा प्रकार उपयुक्त है?

मैं इस ActiveX को लिखने के लिए डेल्फी 7 का उपयोग कर रहा हूं, यदि यह मायने रखता है। हेक्साडेसिमल तारों का उपयोग करना एक विकल्प है। दूसरा क्या हो सकता है?

+0

पहले हाथ में, आपके * दोस्त * को स्वयं का उपयोग करने में सुविधाजनक लगता है? ;-) – OnTheFly

+0

@ user539484 वह कहता है, हेक्स स्ट्रिंग्स;) लेकिन मैं अभी भी अधिक सुविधाजनक समाधान की तलाश में हूं;) –

+3

हेक्स स्ट्रिंग्स, या बेस 64 एन्कोडिंग आदि मुझे एक खराब हैक की तरह लगता है। – kobik

उत्तर

4

वीबी 6 बाइनरी डेटा बाइट चर और सरणी में संग्रहीत।

Dim arrData() As Byte 

VB6 आवेदन OleVariant के रूप में अपने डेल्फी COM है कि चर पास करना चाहिए। डेल्फी COM TStream और इसके लिए VarArray परिवर्तित कर सकते हैं विपरीत:

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 (हेक्स स्ट्रिंग्स, बेस 64 एन्कोडिंग इत्यादि) में भरना। मुझे थोड़े से बदसूरत लग रहा है और एक हैक की तरह लगता है।

+2

बाइनरी डेटा को एन्कोड किए बिना 'BSTR' में रखना संभव है। COM API में बाइनरी 'BSTR' के साथ काम करने के लिए 'SysAllocStringByteLen()' और 'SysStringByteLen()' फ़ंक्शन हैं। यह एक हैक नहीं है, लेकिन यह आमतौर पर उपयोग की जाने वाली सुविधा नहीं है। 'VT_UI1' तत्व युक्त' सुरक्षा 'में बाइनरी डेटा को पार करने के लिए एक बेहतर विकल्प है, हालांकि ('ISTream' भी बेहतर है)। –

+0

@ RemyLebeau-TeamB, जानकारी और संपादन के लिए धन्यवाद :) मैं * एन्कोडिंग * 'BSTR' द्वारा एक हैक का जिक्र कर रहा था। – kobik

संबंधित मुद्दे

 संबंधित मुद्दे