From 08:00 PM CDT Friday, August 12 - 01:00 PM CDT Saturday, August 13, ni.com will be undergoing system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.



在LabWindows/CVI使用DataSocket读取字符串数组时遇到的问题



主要软件: LabWindows/CVI Development Systems>>LabWindows/CVI Full Development System
主要软件版本: 5.5
主要软件修正版本: N/A
次要软件: N/A

问题: 我在LabWindows/CVI使用DataSocket读取字符串数组,然后会获得一个错误:“The VARIANT does not contain a SAFEARRAY.”我是按照 Function Panel Help中关于建立DataSocket读和DataSocket写的步骤进行的。

解答: 问题在于使用DS_GetDataValue时,当您有一个字符串数组才能去读。字符串的读和写不是一个问题;是由于对字符串数组的读和写造成了这个问题。

这里有一个解决这个问题的方法。如果数据类型是(CAVT_CTRING | CAVT_ARRAY) -- i.e., 一个char*的一维或者二维数组 -- 使用DS_GetDataValue通过将参数类型定为 CAVT_VARIANT来得到VARIANT,而不是(CAVT_CSTRING | CAVT_ARRAY)。然后使用ActiveX Automation Library中的函数来从VARIANT获得char*的数组。下面是代码范例:
static HRESULT hr;
static DSHandle ds;
static unsigned int type;
unsigned int size, n;
char **value;
VARIANT vt;
unsigned int dim1, dim2;

// 初始化DataSocket Reader, etc.

hr = DS_GetDataType (ds, &type, &dim1, &dim2);
size = dim1 * (dim2?dim2:1);

if (type == CAVT_CSTRING|CAVT_ARRAY) {
value = malloc (size * sizeof (char *));

#if 0 // 这条是受到问题影响的代码语句
hr = DS_GetDataValue (ds, CAVT_CSTRING | CAVT_ARRAY, value, size * sizeof(char *), 0, 0);

#else // 把这段代码作为一个临时的解决办法
hr = CA_VariantSetEmpty (&vt);
hr = DS_GetDataValue (ds, CAVT_VARIANT, &vt, sizeof(VARIANT), 0, 0);

if (!dim2) // 一维的char*数组
hr = CA_VariantGet1DArrayBuf (&vt, CAVT_CSTRING, value, size * sizeof(char*), 0);

else // 二维的char*数组
hr = CA_VariantGet2DArrayBuf(&vt, CAVT_CSTRING, value, size * sizeof (char*), 0, 0);
#endif

// 打印和释放字符串
for (n = 0; n < size; n++) {
printf("value[%d]: %s\n", n, value[n]);
DS_FreeMemory (value[n]);
}

// 释放数组
free (value);
value = 0;

// Clean up


相关链接:

附件:


reader.zipwriter.zip


报告日期: 11/06/2006
最近更新: 11/09/2006
文档编号: 1Y1FH53P