Com 什么';IDL中不可处理类的目的是什么?

Com 什么';IDL中不可处理类的目的是什么?,com,interop,com-interop,idl,midl,Com,Interop,Com Interop,Idl,Midl,在IDL中声明如下不可处理类的原因是什么 [ uuid(uuidhere), noncreatable ] coclass CoClass { [default] interface ICoClass; }; 我的意思是这样的类无论如何都不会注册到COM。在IDL文件和编译该IDL文件生成的类型库中提到它的原因是什么?当您想阻止客户端使用默认类工厂实例化对象,但仍然有一个用于日志记录、调试和c的正确CLSID时,不可处理是很好的;请参阅以这种方式正确解决的问题的示例。如

在IDL中声明如下不可处理类的原因是什么

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

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

当您想阻止客户端使用默认类工厂实例化对象,但仍然有一个用于日志记录、调试和c的正确CLSID时,不可处理是很好的;请参阅以这种方式正确解决的问题的示例。

如果您希望阻止客户端使用默认类工厂实例化对象,但仍有用于日志记录、调试和c的正确CLSID,则“不可处理”很好;查看一个以这种方式正确解决的问题的示例。

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

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


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

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

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


在IDL中提到不可处理类实际上是可选的。但是,请注意,不管怎样,包含它们至少有一个好处:midl将创建CLSID_CoClass常量等。

让我们假设我不希望从外部创建此类的对象-仅通过一些检索/创建方法返回它们的接口。在IDL中声明类并使其不可处理有什么意义吗?为什么不省略它的声明呢?noncreatable正是您在那里要求的:)。如果您将其保留在-您将获得其他类的所有好处(例如,在任何MS-VBA兼容工具的对象视图中出现),但只能通过自定义创建者创建。@Sharptoth,如果从类型库中完全省略该类,您将如何定义它支持的方法?@SMeaden我将公开它实现的接口,就是这样。所有方法都只接受或返回诸如“int”之类的基元类型或接口指针。@sharptooth:啊,是的。很抱歉,你是对的,当然,有人定义了接口上的方法。让我们假设我不希望这个类的对象被外部创建-只通过一些检索/创建方法返回它们的接口。在IDL中声明类并使其不可处理有什么意义吗?为什么不省略它的声明呢?noncreatable正是您在那里要求的:)。如果您将其保留在-您将获得其他类的所有好处(例如,在任何MS-VBA兼容工具的对象视图中出现),但只能通过自定义创建者创建。@Sharptoth,如果从类型库中完全省略该类,您将如何定义它支持的方法?@SMeaden我将公开它实现的接口,就是这样。所有方法都只接受或返回诸如“int”之类的基元类型或接口指针。@sharptooth:啊,是的。我很抱歉,你是对的,当然,我们定义了接口上的方法。