VB6バイト変数と配列に格納されたバイナリデータ。
Dim arrData() As Byte
VB6アプリケーションは、その変数をOleVariant
としてDelphi COMに渡す必要があります。これは、を介してバイナリデータのバイトSAFEARRAY
を使用する最も一般的なアプローチである
// 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;
:CoClass
単位で
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;
使用: デルファイCOMはVarArray
TStream
へ及びその逆に変換することができCOMオートメーション。
BSTR
(16進数文字列、Base64エンコーディングなど)にデータを格納すると、ちょっと醜い音がして、ハックのように思えます。
最初の手で、あなたの*友人が自分で使いやすいものを見つけましたか? ;-) – OnTheFly
@ user539484彼は言う、16進文字列;)しかし、私はまだより便利な解決策を探しています;) –
16進文字列、またはBase64エンコードなどは私に貧しいハックのように聞こえる。 – kobik