2014-03-12 48 views
2

我通过COM连接指纹读取器,我需要帮助将VB.NET和C++代码转换为Delphi。Delphi COM将ByteArray传递为OleVariant

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

的getData没有使用我送参数返回true。发送我的可执行文件来支持并告诉我,API获取0x400C(VT_VARIANT或VT_BYREF)而不是0x4011。

我的代码有问题吗?

请帮忙!

UPDATE:

这里从调度接口

function GetData(var ImageData: OleVariant): WordBool; dispid 23; 

是从部件的包装

.. 
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) 

UPDATE 20140313

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

+0

请您检查详细信息。 C#代码实际上是C++我相信。如果是这样,那么函数参数不匹配。 C++代码按值接受VARIANT结构。除非函数arg需要引用。您的Delphi代码通过Var的Variant。所以,请更多细节。至少包含两种语言的getData函数声明。 –

+0

当我尝试重新创建你所描述的内容时,var类型就会碰到'0x4011'。我认为您在互操作性边界上的签名存在错误。所以我认为我们需要看到更多。 –

+0

这是C++。我的错 – jdc

回答

1

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

+0

这是一个safearray。他想要VT_BYREF。 –

+0

David是对的,VarArrayCreate不会工作 – jdc

+0

@jdc:你试过了吗?这是什么应该在VB版本 –

相关问题