Чтение и отображение данных из варианта VT_ARRAY | VT_BSTR?

Я хочу использовать инструмент с интерфейсом COM-объекта. К сожалению, в SDK нет примера C ++, только C #.

После создания класса-обертки я могу успешно прочитать серийный номер инструмента в VARIANT:

 VARIANT snumbers;
PowerMeter=new TCoLMMeasurement(Form1);
PowerMeter->ScanUSB(&snumbers);

Однако я не могу получить серийный номер правильно из VARIANT, который имеет тип (VT_ARRAY | VT_BSTR).
Я прочитал документацию типа, вот что я попробовал и что я получил:

info("type of data: " + AnsiString(snumbers.vt));
info("VT_ARRAY|VT_BSTR = " + AnsiString(VT_ARRAY |VT_BSTR));
info("Size of an element(bytes): " + AnsiString(snumbers.parray->cbElements));
info("Number of dimensions: " + AnsiString(snumbers.parray->cDims));
info("Size of dimension 0: " + AnsiString(snumbers.parray->rgsabound[0].cElements));
info("value of pVdata[0]: " + AnsiString(((long*)(snumbers.parray->pvData))[0]));
info(((long*)snumbers.bstrVal)[0]);

SAFEARRAY* pSafeArray=NULL;
pSafeArray=V_ARRAY(&snumbers);
long element=0;
long i=0;
SafeArrayGetElement(pSafeArray,&i,(void*)&element);
info(element);

Приведенный выше код отображает эти результаты:

type of data: 8200
VT_ARRAY|VT_BSTR = 8200
Size of an element(bytes): 4
Number of dimensions: 1
Size of dimension 0: 1
value of pVdata[0]: 1591532
25165825
1592716

Серийный номер должен быть 700187.

Я сделал testint в приложении форм VCL, созданном с помощью CodeGear RAD C ++ Builder 2007

Спасибо за любую помощь!

Gaszton

0

Решение

Использование преобразования BSTR решило проблему. Я не знал о сложности типа BSTR.

info("value of pVdata[0]: " + AnsiString(((BSTR*)(snumbers.parray->pvData))[0]));

или же

SAFEARRAY* pSafeArray=NULL;
pSafeArray=V_ARRAY(&snumbers);
BSTR element;
long i=0;
SafeArrayGetElement(pSafeArray,&i,(void*)&element);
info("value of element0: " + AnsiString(element));
2

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector