वीबी 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 एन्कोडिंग इत्यादि) में भरना। मुझे थोड़े से बदसूरत लग रहा है और एक हैक की तरह लगता है।
पहले हाथ में, आपके * दोस्त * को स्वयं का उपयोग करने में सुविधाजनक लगता है? ;-) – OnTheFly
@ user539484 वह कहता है, हेक्स स्ट्रिंग्स;) लेकिन मैं अभी भी अधिक सुविधाजनक समाधान की तलाश में हूं;) –
हेक्स स्ट्रिंग्स, या बेस 64 एन्कोडिंग आदि मुझे एक खराब हैक की तरह लगता है। – kobik