如何防止组件类实现在一个ATL类型库被暴露(How to prevent coclass imple

2019-09-21 02:50发布

我建立一个ATL类型库有类型的类工厂。 事情八九不离十是这样的:

[ 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;
}

然后,用户可以得到一个实现了一个类的实例INumber通过接口NumberFactory

这种运作良好,但我无法弄清楚如何定义和实例化通过返回的ATL对象NumberFactory.GetNumber()方法。 如果我在IDL这样定义的数字:

[ uuid(...) ]
coclass One {
    [default] interface INumber;
}

One组件类可以由用户进行实例化。 但我想,以限制它,就可以得到的一个实例的唯一办法One组件类是通过调用NumberFactory.GetNumber("One")

所以我的问题是:应该如何IDL编写,因此用户无法实例化One ,但仍然能够实例化One从此内NumberFactory组件类和返回INumber的接口, One用户?

此外,有什么特别的必须在事物的ATL端进行,为了使这项工作?

Answer 1:

  1. 从IDL中删除的CoClass
  2. 从对象表中删除的CoClass(除去其OBJECT_ENTRY_AUTO)
  3. 保持CNumber类
  4. 您的GetNumber(...)的代码看起来应该是这样的:
 *pVal = new CComObject<CNumber>(); (*pVal)->AddRef(); 

这种方式有没有伴生类由用户创建的,工厂是谁可以生产他们的唯一一个。



Answer 2:

显然,我正在寻找错误的东西...我发现在一个相关的问题(从侧边栏)的答案,即使我无法找到它,而问这个问题之前,搜索...

答案是两个方面:

  1. 加入noncreatable在IDL的共类定义
  2. 卸下OBJECT_ENTRY_AUTO (如果由向导生成在底部)从ATL头文件条目

看到这个MSDN文章: http://msdn.microsoft.com/en-us/library/4tc639ss.aspx



文章来源: How to prevent coclass implementations from being exposed in an ATL type library
标签: com atl idl