VB6 Binärdaten werden in Byte-Variablen und Arrays gespeichert.
Dim arrData() As Byte
Die VB6-Anwendung sollte diese Variable als OleVariant
an Ihr Delphi-COM übergeben. Delphi-COM kann VarArray
in TStream
und umgekehrt konvertieren:
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;
Verwendung in der CoClass
-Einheit:
// 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;
// etwas mit dem Stream machen ...
// ... und einige Binärdaten an den Aufrufer zurückgeben (* BinOut)
Stream.Position := 0;
StreamToVariant(Stream, Result);
finally
Stream.Free;
end;
end;
Dies ist der häufigste Ansatz zur Verwendung von SAFEARRAY
von Bytes mit Binärdaten über COM-Automatisierung.
Die Daten in ein BSTR
zu stecken (Hexadezimale Zeichenfolgen, Base64-Codierung usw.) klingt für mich ziemlich hässlich und scheint eher wie ein Hack.