Какой тип данных подходит для обработки двоичных данных в методе ActiveX? - PullRequest
5 голосов
/ 13 февраля 2012

Я пишу элемент управления ActiveX для моего друга, который должен инкапсулировать процедуры шифрования.Он будет использоваться в основном из VB6.Какой тип данных я должен выбрать для двоичных данных, таких как ключ шифрования, вектор инициализации, входные и выходные данные, чтобы моему другу было удобно использовать его из VB6?

Я использую Delphi 7, чтобы написать этоActiveX, если это имеет значение.Одним из вариантов является использование шестнадцатеричных строк.Что может быть другим?

1 Ответ

4 голосов
/ 13 февраля 2012

VB6 Двоичные данные, хранящиеся в байтовых переменных и массивах.

Dim arrData() As Byte

VB6 Приложение должно передать эту переменную в ваш Delphi COM как OleVariant.Delphi COM может конвертировать VarArray в TStream и наоборот:

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 единице:

// 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;

Это наиболее распространенный подходиспользовать SAFEARRAY байтов с двоичными данными с помощью автоматизации COM.
вставка данных в BSTR (шестнадцатеричные строки, кодирование Base64 и т. д.) звучит для меня несколько уродливо и больше похоже на взлом.

...