2012-02-13 17 views
5

Tôi đang viết một điều khiển ActiveX cho bạn của tôi, nên đóng gói các thói quen mã hóa. Nó sẽ được sử dụng từ VB6 chủ yếu. Tôi nên chọn loại dữ liệu nào cho dữ liệu nhị phân như khóa mã hóa, vectơ khởi tạo, dữ liệu đầu vào và đầu ra để thuận tiện cho bạn tôi sử dụng nó từ VB6?Loại dữ liệu nào phù hợp để xử lý dữ liệu nhị phân trong phương thức ActiveX?

Tôi đang sử dụng Delphi 7 để viết ActiveX này, nếu có vấn đề. Một lựa chọn là sử dụng chuỗi thập lục phân. Cái gì có thể là cái kia?

+0

Mặt khác, những gì * bạn * của bạn thấy thuận tiện khi sử dụng? ;-) – OnTheFly

+0

@ 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;) –

+3

chuỗi hex, hoặc mã hóa base64 vv có vẻ giống như một tin xấu cho tôi. – kobik

Trả lời

4

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.

+2

Có thể đưa dữ liệu nhị phân vào một 'BSTR' mà không mã hóa nó. COM API có các hàm 'SysAllocStringByteLen()' và 'SysStringByteLen()' để làm việc với nhị phân 'BSTR'. Đây không phải là một hack, nhưng nó không phải là một tính năng thường được sử dụng. Một 'SAFEARRAY' chứa các phần tử' VT_UI1' là một lựa chọn tốt hơn để truyền dữ liệu nhị phân, mặc dù ('IStream' thậm chí còn tốt hơn). –

+0

@ RemyLebeau-TeamB, Cảm ơn thông tin và chỉnh sửa :) Tôi đã đề cập đến một hack bằng cách * mã hóa * 'BSTR'. – kobik

Các vấn đề liên quan