首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

调用函数ReadVariable()的参数类型有关问题

2012-04-07 
调用函数ReadVariable()的参数类型问题,我要调用的函数为:ReadVariable(wchar_t *,tagVARIANT *,long *,do

调用函数ReadVariable()的参数类型问题,
我要调用的函数为:
ReadVariable(wchar_t *,tagVARIANT *,long *,double *) ;
ReadVariable(wchar_t *ItemID,tagVARIANT *value,long *Quality,double *Timestamp) ;
我是如此使用的:
wchar_t add ; //将字符串形式转换成WCHAR_T形式, 输入
tagVARIANT myvalue ; //INT, 输出
long myQuality ; //INT, 输出
double myTimestamp ; //日期和时间, 输出
ReadVariable(&ItemID,&value,&Quality,&Timestamp) ;
上述使用能通过编译,也能执行,但是结果却不对,
如myTimestamp用Edit->text显示的结果不是日期和时间,而是一个长整数.
请大家帮帮忙吧,先谢谢了


[解决办法]
第一个参数有问题,函数要求是一个wchar_t的字符串,而你提供的是一个wchar_t字符的地址。
试试这样:

C/C++ code
wchar_t *lpAdd = L"xxx";VARIANT vValue;long lQuality;double fTimestamp;ReadVariable(lpAdd, &vValue, &lQuality, &fTimestamp);
[解决办法]
1、COM中使用的 BSTR 与 非COM中的 wchar_t * 是有区别的。

Widestring 封装的是COM中的BSTR,调用COM时,使用Widestring 是比较方便的。
COM中这样用:
BSTR lpAdd = SysAllocString ( L"s7:[s7 connection_1]db19,w132");
...使用lpAdd调用COM
用完后调用:SysFreeString(lpAdd);

觉得麻烦,就用WideString封装吧,也挺方便的。
Widestring A = L"s7:[s7 connection_1]db19,w132";
用 A.c_bstr() 调用COM
用完后自动会析构。

错误的用法:
wchar_t *lpAdd = L"s7:[s7 connection_1]db19,w132";
用lpAdd调用COM 。。。//会产生异常:不同进程,COM不能读该地址。

BSTR的内存由谁分配? 若BSTR作为接口方法的传入参数,则调用方负责分配和释放;若作为传出参数,则接口对象负责分配,调用方负责释放。

2、返回值double 为一浮点数,要转换成时间值,这个要看对方的时间定义是如何的。
COM 系统采用的基准日期是公元 1899 年 12 月 30 日,与BCB/Delphi一致
但能否用 TdateTime(double)可能得测试一下或者看文档。 

[解决办法]
先这样试一下:
C/C++ code
WideStrign Add = "s7:[s7 connection_1]db19,w132"; //这个就是西门子下位机内数据存放地址VARIANT vValue; long lQuality; double fTimestamp;VariantInit(&vValue);DatCon1->ReadVariable(Add.c_bstr(), &vValue, &lQuality, &fTimestamp); 

热点排行