0

我正在尝试为我的 VBA 项目创建一个 COM 类库,而我似乎偶然发现的一个限制是在 New() 子例程上使用构造函数。创建新的 COM 类后,将使用以下注释创建 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 中实现对象时,在尝试输入“预期语句结束”的参数时出现错误。如果有人有任何信息将不胜感激。

谢谢你。

4

1 回答 1

2

所有暴露给 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();
   }
};

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

于 2010-07-14T04:58:03.187 回答