6 Stimmen

Welcher Datentyp ist geeignet, um binäre Daten in der ActiveX-Methode zu verarbeiten?

Ich schreibe eine ActiveX-Steuerelement für meinen Freund, das Verschlüsselungsroutinen kapseln sollte. Es wird hauptsächlich von VB6 verwendet. Welchen Datentyp sollte ich für binäre Daten wie Verschlüsselungsschlüssel, Initialisierungsvektor, Eingabe- und Ausgabedaten wählen, damit es für meinen Freund bequem ist, es von VB6 aus zu verwenden?

Ich benutze Delphi 7, um dieses ActiveX zu schreiben, falls das wichtig ist. Eine Möglichkeit ist die Verwendung von hexadezimalen Zeichenketten. Was könnte das andere sein?

4voto

kobik Punkte 20720

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X