Я подключаю сканер отпечатков пальцев через 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
}
Вот мой код Delphi:
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.
Что-то не так с моим Кодексом?
Пожалуйста помоги!
ОБНОВИТЬ:
вот из интерфейса
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)
ОБНОВЛЕНИЕ 20140313
Наш поставщик отправил новый OCX для обработки данных, полученных от Delphi.
Вы уверены, что это 0x4011, а не 0x2011? поскольку varArray = $2000
а также VarArrayCreate([0,size-1],varByte)
создаст OleVariant с массивом varByte, как код VB. Если это работает, используйте VarArrayLock
а также VarArrayUnlock
для доступа к данным.
Других решений пока нет …