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

时间:2009-07-27 22:26:40

标签: com atl idl

我正在构建一个具有类工厂类型的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接口的类的实例。

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

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

One coclass可以由用户实例化。但是我想限制它,所以你可以通过调用One获得NumberFactory.GetNumber("One") coclass实例的唯一方法。

所以我的问题是:如何编写IDL以便用户无法实例化One,但仍能够从One coclass中实例化NumberFactory并返回{{ 1}} INumber与用户的界面?

此外,为了实现这一目标,ATL方面还有什么特别的事情要做吗?

2 个答案:

答案 0 :(得分:4)

  1. 从IDL中删除CoClass
  2. 从对象表中删除CoClass(删除其OBJECT_ENTRY_AUTO)
  3. 保留CNumber课程
  4. 您的GetNumber(...)代码应如下所示:
  5. *pVal = new CComObject<CNumber>();  
    (*pVal)->AddRef();
    

    这样,用户就无法创建CoClass,您的工厂是唯一可以生产CoClass的人。

答案 1 :(得分:1)

显然我正在寻找错误的东西......我在相关问题中找到了答案(来自侧边栏),即使我在搜索问题之前无法找到它...

答案是双重的:

  1. noncreatable添加到IDL
  2. 中的coclass定义
  3. 从ATL头文件中删除OBJECT_ENTRY_AUTO条目(如果由向导生成,则在底部)
  4. 请参阅此MSDN文章:http://msdn.microsoft.com/en-us/library/4tc639ss.aspx

相关问题