热情软件屋

 

怎样在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
     // 未省略参数

此问题由李海回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio