为 CCW 使用 Sub New() 上的构造函数

Posted

技术标签:

【中文标题】为 CCW 使用 Sub New() 上的构造函数【英文标题】:Using constructors on the Sub New() for a CCW 【发布时间】:2010-07-13 12:55:55 【问题描述】:

我正在尝试为我的 VBA 项目创建一个 COM 类库,而我似乎偶然发现的限制之一是在 New() 子例程上使用构造函数。创建新的 COM 类后,将使用以下 cmets 创建 Public Sub New()

' A creatable COM class must have a Public Sub New() 
' with no parameters, otherwise, the class will not be 
' registered in the COM registry and cannot be created 
' via CreateObject.

很明显,虽然我想使用 new 关键字创建更多子例程,以允许不同的参数。但是,当我尝试执行此操作并在 VBA 中实现对象时,在尝试输入“预期语句结束”的参数时出现错误。如果有人有任何信息将不胜感激。

谢谢。

【问题讨论】:

【参考方案1】:

所有暴露给 COM 的类都必须有一个无参数的构造函数 - 句点。原因是当客户端实例化一个类时,调用最终会进入CoCreateInstance() 全局函数(或IClassFactory::CreateInstance(),几乎相同)。 CoCreateInstance()(或IClassFactory::CreateInstance())无法将参数传递给类的构造函数,因此类必须有一个无参数构造函数——该构造函数将用于在内部实例化类。

如果您需要的不仅仅是无参数构造函数 - 使用工厂类。伪代码:

// this should be made COM-exposed
interface IYourClassInterface 
;

// this should not be made COM-exposed
class CYourClass 
public:
    CYourClass( parameters ) 
;

class CYourClassFactory 
public:
   CYourClassFactory()  //<- parameterless constructor
   IYouClassInterface* CreateInstance( parameters here )
   
      return new CYourClass();
   
;

这样你就有了一个带有无参数构造函数的工厂类。您实例化工厂,然后调用它的创建者方法来实例化您的类。

【讨论】:

以上是关于为 CCW 使用 Sub New() 上的构造函数的主要内容,如果未能解决你的问题,请参考以下文章

new实例化函数的过程

javascript中构造函数知识总结

js构造函数 实例与new对象

js构造函数的方法与原型prototype

javascript中构造函数的说明

new一个对象后面加括号与不加括号的区别