VB6 Dữ liệu nhị phân được lưu trữ trong các biến và mảng Byte.
Dim arrData() As Byte
VB6 Ứng dụng phải chuyển biến đó tới COM Delphi của bạn là OleVariant
. Delphi COM có thể chuyển đổi VarArray
-TStream
và ngược lại:
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;
Cách sử dụng trong CoClass
đơn vị:
// 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;
Đây là phương pháp phổ biến nhất để sử dụng SAFEARRAY
của Bytes với dữ liệu nhị phân qua Tự động hóa COM.
Nhét dữ liệu vào một số BSTR
(chuỗi Hex, Mã hóa Base64, v.v.) âm thanh tệ hại với tôi và có vẻ giống như một hack.
Mặt khác, những gì * bạn * của bạn thấy thuận tiện khi sử dụng? ;-) – OnTheFly
@ user539484 Ông nói, chuỗi hex;) Nhưng tôi vẫn đang tìm giải pháp tiện lợi hơn;) –
chuỗi hex, hoặc mã hóa base64 vv có vẻ giống như một tin xấu cho tôi. – kobik