为 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() 上的构造函数的主要内容,如果未能解决你的问题,请参考以下文章