我通过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收到的数据。
答案 0 :(得分:1)
你确定它是0x4011而不是0x2011吗?由于varArray = $2000
和VarArrayCreate([0,size-1],varByte)
会创建一个OleVariant,其varByte数组与VB代码类似。如果可以,请使用VarArrayLock
和VarArrayUnlock
来访问数据。