【问题标题】:Read and display data from Variant VT_ARRAY | VT_BSTR?从 Variant VT_ARRAY | 读取和显示数据VT_BSTR?
【发布时间】:2013-10-22 15:49:48
【问题描述】:

我想使用具有 COM 对象接口的仪器。不幸的是,SDK 中没有 C++ 示例,只有 C#。

创建包装类后,我可以成功地将仪器的序列号读入一个VARIANT:

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

但是,我无法从具有 (VT_ARRAY | VT_BSTR) 类型的 VARIANT 中正确获取序列号。 我阅读了该类型的文档,这是我尝试过的和得到的:

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。

我在使用 CodeGear RAD C++ Builder 2007 创建的 VCL 表单应用程序中进行了测试

感谢您的任何帮助!

加斯顿

【问题讨论】:

    标签: c++ c++builder variant bstr


    【解决方案1】:

    使用 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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 2022-12-11
      • 2021-09-02
      相关资源
      最近更新 更多