我通過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來處理從德爾福收到的數據。
請您檢查詳細信息。 C#代碼實際上是C++我相信。如果是這樣,那麼函數參數不匹配。 C++代碼按值接受VARIANT結構。除非函數arg需要引用。您的Delphi代碼通過Var的Variant。所以,請更多細節。至少包含兩種語言的getData函數聲明。 –
當我嘗試重新創建你所描述的內容時,var類型就會碰到'0x4011'。我認爲您在互操作性邊界上的簽名存在錯誤。所以我認爲我們需要看到更多。 –
這是C++。我的錯 – jdc