Delphi COM передает ByteArray как OleVariant

Я подключаю сканер отпечатков пальцев через 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.

2

Решение

Вы уверены, что это 0x4011, а не 0x2011? поскольку varArray = $2000 а также VarArrayCreate([0,size-1],varByte) создаст OleVariant с массивом varByte, как код VB. Если это работает, используйте VarArrayLock а также VarArrayUnlock для доступа к данным.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]