我正在构建一个具有类工厂类型的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方面还有什么特别的事情要做吗?
答案 0 :(得分:4)
*pVal = new CComObject<CNumber>(); (*pVal)->AddRef();
这样,用户就无法创建CoClass,您的工厂是唯一可以生产CoClass的人。
答案 1 :(得分:1)
显然我正在寻找错误的东西......我在相关问题中找到了答案(来自侧边栏),即使我在搜索问题之前无法找到它...
答案是双重的:
noncreatable
添加到IDL OBJECT_ENTRY_AUTO
条目(如果由向导生成,则在底部)请参阅此MSDN文章:http://msdn.microsoft.com/en-us/library/4tc639ss.aspx