首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止coclass实现在ATL类型库中公开

如何防止coclass实现在ATL类型库中公开
EN

Stack Overflow用户
提问于 2009-07-27 22:26:40
回答 2查看 1.3K关注 0票数 4

我正在构建一个具有类工厂类型的ATL类型库。类似这样的东西:

代码语言:javascript
复制
[ object, uuid(...), ... ]
interface INumber : IDispatch {
    [propget, id(0)] HRESULT Value([out, retval] LONG* pVal);
}

[ object, uuid(...), ... ]
interface INumberFactory : IDispatch {
    [id(1)] HRESULT GetNumber([in] BSTR numberName, [out, retval] INumber* pVal);
}

[ uuid(...) ]
coclass NumberFactory {
    [default] interface INumberFactory;
}

然后,用户可以通过NumberFactory获取实现INumber接口的类的实例。

这工作得很好,但是我不知道如何定义和实例化通过NumberFactory.GetNumber()方法返回的ATL对象。如果我这样定义IDL中的数字:

代码语言:javascript
复制
[ uuid(...) ]
coclass One {
    [default] interface INumber;
}

One coclass可以由用户实例化。但是我想限制它,这样您就可以通过调用NumberFactory.GetNumber("One")来获取One coclass的实例。

所以我的问题是:应该如何编写IDL,这样用户就不能实例化One,但仍然能够从NumberFactory coclass中实例化One,并将OneINumber接口返回给用户?

此外,在ATL方面有没有什么特别的事情必须做才能让它工作呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-07-28 06:24:38

从IDL中删除代码,并从对象表中删除代码(remove OBJECT_ENTRY_AUTO)

  • Keep
  1. CoClass
  2. GetNumber(...)应该类似于:

*pVal = CComObject();(*pVal)->AddRef();

这样,用户就不需要创建CoClass,您的工厂就是唯一可以生产它们的工厂。

票数 4
EN

Stack Overflow用户

发布于 2009-07-27 23:05:30

显然我找错了东西。我在一个相关的问题中找到了答案(从侧边栏),尽管我在提问之前搜索时找不到答案……

答案有两个:

  1. 在IDL
  2. 中将noncreatable添加到coclass定义中从ATL头文件中删除OBJECT_ENTRY_AUTO条目(如果由向导生成,则位于底部)

请参阅MSDN文章:http://msdn.microsoft.com/en-us/library/4tc639ss.aspx

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1191012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档