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.
İlk olarak, * arkadaşınızın * kullanımı uygun bulduğu nedir? ;-) – OnTheFly
@ user539484 O, altıgen dizeleri;) Ama hala daha uygun bir çözüm arıyorum;) –
hex dizeleri, veya base64 kodlama vb bana kötü bir kesmek gibi geliyor. – kobik