找回密码
 注册
Simdroid-非首页
查看: 186|回复: 1

[2. C/C++/C#] 【求助】请问 variant 返回的是数组如何读出(vc)。

[复制链接]
发表于 2004-4-20 19:40:27 | 显示全部楼层 |阅读模式 来自 江苏镇江
  我使用 ni的pci-6111e的采集卡,它有两个ad通道,可以同时采集两路数据。  现在我使用measurement studio 在vc下开发ad转换程序。同时采集两路输入信号。 现在已经知道,使用cwai控件,在数据采集完成后的触发事件函数里,有它返回的采集数据: 函数声明如下:
  OnAcquiredDataCwai1(VARIANT FAR* ScaledData, VARIANT FAR* BinaryCodes)  
{
   //自己的操作。
}
   根据我查阅帮助文档知道,如果是两路数据采集,返回的数据(在ScaledData中)是一个2d数组。  我试了很多方法都没法从ScaledData里面获得采集的数据。恳请哪位大侠曾经做过类似的采集程序。或有谁精通variant 的数据操作,主要是2d数组的操作,1d的我已经试验通过了 。
发表于 2004-4-20 21:40:02 | 显示全部楼层 来自 美国

回复: 【求助】请问 variant 返回的是数组如何读出(vc)。

Simdroid开发平台
VARIANT 、_variant_t
  
VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。  
对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:  
VARIANT va;  
int a=2001;  
va.vt=VT_I4;///指明整型数据  
va.lVal=a; ///赋值  
  
对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:  
  
unsigned char bVal; VT_UI1  
short iVal; VT_I2  
long lVal; VT_I4  
float fltVal; VT_R4  
double dblVal; VT_R8  
VARIANT_BOOL boolVal; VT_BOOL  
SCODE scode; VT_ERROR  
CY cyVal; VT_CY  
DATE date; VT_DATE  
BSTR bstrVal; VT_BSTR  
IUnknown FAR* punkVal; VT_UNKNOWN  
IDispatch FAR* pdispVal; VT_DISPATCH  
SAFEARRAY FAR* parray; VT_ARRAY|*  
unsigned char FAR* pbVal; VT_BYREF|VT_UI1  
short FAR* piVal; VT_BYREF|VT_I2  
long FAR* plVal; VT_BYREF|VT_I4  
float FAR* pfltVal; VT_BYREF|VT_R4  
double FAR* pdblVal; VT_BYREF|VT_R8  
VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL  
SCODE FAR* pscode; VT_BYREF|VT_ERROR  
CY FAR* pcyVal; VT_BYREF|VT_CY  
DATE FAR* pdate; VT_BYREF|VT_DATE  
BSTR FAR* pbstrVal; VT_BYREF|VT_BSTR  
IUnknown FAR* FAR* ppunkVal; VT_BYREF|VT_UNKNOWN  
IDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCH  
SAFEARRAY FAR* FAR* pparray; VT_ARRAY|*  
VARIANT FAR* pvarVal; VT_BYREF|VT_VARIANT  
void FAR* byref; VT_BYREF  
  
_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。  
例如:  
long l=222;  
ing i=100;  
_variant_t lVal(l);  
lVal = (long)i;  
  
另外在这http://www.gjwtech.com/scomm/sc1mscommmemproblom.htm有一篇文章”VC串口控件编程,解决内存不断增加的问题“
  
一段代码
  1. VARIANT m_input1;
  2. ColeSafeArray m_input2;
  3. Long length,i;
  4. BYTE data[1024];
  5. Cstring str;
  6. if(m_Comm.GetCommEvent()= =2)//接收缓冲区内有字符
  7. {
  8. m_input1=m_Comm.Getinput();//读取缓冲区内的数据
  9. m_input2=m_input1;//将VARIANT型变量譥aa换为ColeSafeArray型变量
  10. length=m_input2.GetOneDimSize();//确定数据长度
  11. for(i=0;i<length;i++)
  12. m_input2.GetElement(&i,data+i);//将数据转换为BYTE型数组
  13. for(i=0;i<length;i++)//将数组转换为Cstring型变量
  14. {
  15. char a=* (char *)(data+i);
  16. str.Format(“%c”,a);
  17. m_ReceiveData+=str;
  18. }
复制代码

  
希望对你有帮助。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-11-2 03:29 , Processed in 0.061451 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表