我通过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