Delphi COM将ByteArray作为OleVariant传递

时间:2014-03-12 07:39:32

标签: c++ vb.net delphi delphi-xe

我通过COM连接指纹识别器,我需要帮助将VB.NET和C ++代码转换为Delphi。

API将olevariant作为参数:

Function FingerPrint.GetData(var ImageData : OleVariant) : WordBool;
提供了VB.NET示例:

Dim imgData() as Byte
ReDim imgData(fingerPrint.ImageSize) as Byte

If fingerPrint.GetData(imgData) = True Then  
   'Success
End If

提供的C ++示例:

BYTE* dataBuff = new BYTE[fingerPrint.ImageSize];
VARIANT imgData;

imgData.vt = VT_BYREF|VT_UI1;
imgData.pbVal = dataBuff;

if(fingerPrint.getData(imgData) == TRUE) {
  //Success
}

这是我的德尔福法典:

procedure GetImgData();
var varBuffer : OleVariant;
    imgBuff : PByteArray;
begin
     GetMem(imgBuff, fingerPrint.ImageSize);

     try
        tagVariant(varBuffer).vt    := VT_UI1 or VT_BYREF; // 0x4011
        tagVariant(varBuffer).pbVal := Pointer(imgBuff);

        if fingerPrint.getData(varBuffer) then
        begin
             // success
        end;
     finally
        FreeMem(imgBuff);
     end;
end;

另一种方法:

procedure GetImgData();
var varBuffer : OleVariant;
    tagV : TVariantArg;
    imgBuff : PByteArray;
begin
     GetMem(imgBuff, fingerPrint.ImageSize);

     try
        tagV.vt    := VT_UI1 or VT_BYREF; // 0x4011
        tagV.pbVal := Pointer(imgBuff);

        varBuffer  := OleVariant(tagV);

        if fingerPrint.getData(varBuffer) then
        begin
             // success
        end;
     finally
        FreeMem(imgBuff);
     end;
end;

使用参数i&m;发送时,getData未返回true。发送我的可执行文件以支持并告诉我API正在获得0x400C(VT_VARIANT或VT_BYREF)而不是0x4011。

我的代码有什么问题?

请帮助!

更新:

来自dispinterface

function GetData(var ImageData: OleVariant): WordBool; dispid 23;
来自Component Wrapper的

..
function GetData(var ImageData : OleVariant): WordBool;
..
function TFingerPrint.GetData(var ImageData : OleVariant): WordBool;
begin
  Result := DefaultInterface.GetData(ImageData);
end;

C ++声明

BOOL getData(const VARIANT FAR& imgData)

更新20140313

我们的供应商发送了新的OCX来处理从Delphi收到的数据。

1 个答案:

答案 0 :(得分:1)

你确定它是0x4011而不是0x2011吗?由于varArray = $2000VarArrayCreate([0,size-1],varByte)会创建一个OleVariant,其varByte数组与VB代码类似。如果可以,请使用VarArrayLockVarArrayUnlock来访问数据。