0

在 IDL 中声明如下不可创建的 coclass 的原因是什么?

[
    uuid(uuidhere),
    noncreatable
]
coclass CoClass {
    [default] interface ICoClass;
};

我的意思是这样的类无论如何都不会注册到 COM。在 IDL 文件和编译该 IDL 文件生成的类型库中提及它的原因是什么?

4

2 回答 2

2

当您想阻止客户端使用默认类工厂实例化对象但仍然具有用于日志记录、调试等的正确 CLSID 时,noncreatable 非常有用;请参阅http://www.eggheadcafe.com/software/aspnet/29555436/noncreatable-atl-object.aspx上的示例,该示例以这种方式正确解决。

于 2009-04-30T14:42:51.717 回答
2

noncreatable 属性只是对对象使用者的提示——.Net 和 VB6,例如,当看到此属性时,将不允许客户端以“正常方式”创建对象,例如通过调用 New CoClass() [VB6]。

然而,COM 服务器的类工厂是决定它是否允许创建给定类的对象的明确权威——所以事实上,有可能一个类被标记为不可创建,然而,类工厂允许对象被创建。创建的。为避免这种情况,请确保相应地更新您的类工厂。

在 IDL 中提及不可创建的类实际上是可选的。但是请注意,无论如何,您至少可以从包含它们中获得一个好处:midl 将创建 CLSID_CoClass 常量等。

于 2009-05-01T07:33:32.097 回答