2014-03-12 49 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版本 –

相關問題