调用函数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字符的地址。
试试这样:
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)可能得测试一下或者看文档。
[解决办法]
先这样试一下:
WideStrign Add = "s7:[s7 connection_1]db19,w132"; //这个就是西门子下位机内数据存放地址VARIANT vValue; long lQuality; double fTimestamp;VariantInit(&vValue);DatCon1->ReadVariable(Add.c_bstr(), &vValue, &lQuality, &fTimestamp);