【问题标题】:What's the purpose of noncreatable coclasses in IDL?IDL 中不可创建的 coclass 的目的是什么?
【发布时间】:2010-10-22 20:52:41
【问题描述】:

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

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

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

【问题讨论】:

    标签: com interop com-interop idl midl


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 假设我不希望这个类的对象被外部创建——只通过一些检索/创建方法返回它们的接口。在 IDL 中声明类并使其不可创建有什么意义吗?为什么不直接省略它的声明?
      • noncreatable 正是您所要求的 :)。如果你把它留在里面 - 你将拥有其他类的所有好处(例如出现在任何 MS-VBA 兼容工具的对象视图中),但无法创建,只能通过你的自定义创建者。
      • @sharptooth,如果您从类型库中完全省略该类,您将如何定义它支持的方法?
      • @SMeaden 我将公开它实现的接口,就是这样。并且所有方法都只会接受或返回原始类型,例如“int”或接口指针。
      • @sharptooth:啊,是的。抱歉,您当然是对的,在接口上定义方法。
      猜你喜欢
      • 2014-10-04
      • 2010-10-14
      • 1970-01-01
      • 2021-06-26
      • 2010-10-16
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      相关资源
      最近更新 更多