怎样在ActiveX中实现可选参数的方法
编号:QA002721
建立日期: 2000年3月15日 最后修改日期:2000年3月15日
所属类别:
常红平:
本问题涉及的操作系统 :windows
本问题涉及的编程工具:vc
我要在vc中改一个activeX控件,想在原控件的一个方法中加一个参数。为了兼容性的问题,想把该方法新加的参数设为可选参数或用多态性实现。
原方法定义是:short CGridCtrl::AddItem(LPCTSTR cStr);
要变为:short CGridCtrl::AddItem(LPCTSTR cStr, long nRow);
现在的问题是在ClassWizard中新增AddItem方法时报错,说已有AddItem方法请选其他名称。是否意味着ActiveX控件的方法不允许使用多态性?我看MSDN中说optional的参数应用VARIANT类型,于是把原方法改为:
short CGridCtrl::AddItem(LPCTSTR cStr, VARIANT nRow);
但这么定义后用VB调用该控件的方法时如省略row参数,VB仍报“参数不可选”错,表示row参数仍是必须要赋值的,怎么回事?怎样在activeX中实现方法的多态性?
回答:
ActiveX不支持VC++的多态,也就是说不允许两个具有不同参数的方法有同样的名字。但Variant类型很灵活,所以在VB中,ActiveX控件的方法可以使用省略参数。这样的方法是这样实现的:
1、如MSDN所讲,参数必须是VARIANT类型。如果你在ClassWizard中指定该参数为optional,则.odl文件中定义为:
short AddItem(BSTR cStr, [optional] VARIANT nRow);
而C++中为:
short CGridCtrl::AddItem(LPCTSTR cStr, const VARIANT FAR& nRow);
请检查你在ClassWizard中的设置。
2、如果VB省略了参数,则VARIANT变量的vt成员为VT_ERROR,scode成员为DISP_E_PARAMNOTFOUND,即
if(nRow.vt == VT_ERROR
&& nRow.scode == DISP_E_PARAMNOTFOUND)
// 省略参数
else
// 未省略参数
此问题由李海回答。
| |
|
|
| |
|
|