请教:IDispatch 增加一个属性变量Item为VARIANT类型,在SetItem中报错

tomyi 2014-03-24 11:31:03
最近对想在程序中支持Script,便于通过脚本取得软件中一些参数。
在参考http://support.microsoft.com/kb/221992/zh-cn后

通过接口向导添加一个Item属性,由于属性可能是常见的各种类型(BSTR,LONG,DOUBLE等)。定义为变体类型,如下:
	[ uuid(86D2FFCF-1279-465F-A04A-98EFF2E0FE9D) ]
dispinterface IMyScriptObject
{
properties:

methods:
[id(1), propget, helpstring("属性 Item")] VARIANT Item(BSTR bstrName);
[id(1), propput, helpstring("属性 Item")] void Item(BSTR bstrName, VARIANT newVal);
[id(2), helpstring("方法gcd")] LONG gcd(LONG a, LONG b);
[id(3), helpstring("方法HelpAbout")] void HelpAbout(void);
[id(4), helpstring("方法ShowValue")] void ShowValue(BSTR prompt, LONG n);
};


但在调试过程中发现SetItem 函数的第2个参数newVal是一个不能识别的类型,不知道为何?
   void CMyScriptObject::SetItem(LPCTSTR bstrName, VARIANT newVal)
{
AFX_MANAGE_STATE(AfxGetAppModuleState());

// TODO: 在此添加属性处理程序代码
CString str;
if (newVal.vt == VT_I4)
str.Format(_T("%s%d"), bstrName, newVal.intVal );
else
str.Format(_T("%s"), bstrName);

AfxMessageBox(str, MB_SETFOREGROUND);
}


对应的VBS调用如下:
Item("3") = 5

但如果我把VARIANT 改为某个确定的类型,如LONG,程序是没有错误的。为啥VARIANT 就不行呢?
...全文
222 点赞 收藏 8
写回复
8 条回复
tomyi 2014年10月06日
采用楼上xuddk727的意见,暂时这么用吧。
回复 点赞
许文君 2014年03月27日
不行就别传变参,传个BSTR什么的自己分析字符串
回复 点赞
tomyi 2014年03月25日
newVal.vt = 0x2100,不知啥类型
回复 点赞
oyljerry 2014年03月25日
newVal 送过来的类型正确吗
回复 点赞
allenhiman 2014年03月25日
我的意思就是那个vbs没有按照variant的格式赋值给你的setItem 所以让你用MFC或者c#支持variant类型的语言试试看
回复 点赞
tomyi 2014年03月25日
   void CMyScriptObject::SetItem(LPCTSTR bstrName, _variant_t newVal)
   {
	   AFX_MANAGE_STATE(AfxGetAppModuleState());

	   // TODO: 在此添加属性处理程序代码
	VARIANT dest;
	VariantInit(&dest);
	if(VariantChangeType(&dest,&newVal,0,VT_I4))
	{
		int i = 0;
	}

        CString str;
		if (newVal.vt == VT_I4)
			str.Format(_T("%s%d"), bstrName, newVal.intVal );
		else
			str.Format(_T("%s"), bstrName);

      AfxMessageBox(str, MB_SETFOREGROUND);
  }
通过VBS调用,本意是想newVal = 5,实际发现newVal类型变为不可知的了。但我把newVal声明为LONG等具体一个类型时,是没有错的。
回复 点赞
allenhiman 2014年03月25日
你试试用MFC给你的这个属性赋予一个真正的variant类型 看看还会不会出问题 如果问题依旧那就很奇怪了
回复 点赞
allenhiman 2014年03月25日
对vbs不熟 不过感觉Item("3") = 5 这种写法不对
回复 点赞
发动态
发帖子
ATL
创建于2007-09-28

3023

社区成员

4.8w+

社区内容

ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区公告
暂无公告