我正在构建一个具有类工厂类型的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;
}然后,用户可以通过NumberFactory获取实现INumber接口的类的实例。
这工作得很好,但是我不知道如何定义和实例化通过NumberFactory.GetNumber()方法返回的ATL对象。如果我这样定义IDL中的数字:
[ uuid(...) ]
coclass One {
[default] interface INumber;
}One coclass可以由用户实例化。但是我想限制它,这样您就可以通过调用NumberFactory.GetNumber("One")来获取One coclass的实例。
所以我的问题是:应该如何编写IDL,这样用户就不能实例化One,但仍然能够从NumberFactory coclass中实例化One,并将One的INumber接口返回给用户?
此外,在ATL方面有没有什么特别的事情必须做才能让它工作呢?
发布于 2009-07-28 06:24:38
从IDL中删除代码,并从对象表中删除代码(remove OBJECT_ENTRY_AUTO)
*pVal = CComObject();(*pVal)->AddRef();
这样,用户就不需要创建CoClass,您的工厂就是唯一可以生产它们的工厂。
发布于 2009-07-27 23:05:30
显然我找错了东西。我在一个相关的问题中找到了答案(从侧边栏),尽管我在提问之前搜索时找不到答案……
答案有两个:
noncreatable添加到coclass定义中从ATL头文件中删除OBJECT_ENTRY_AUTO条目(如果由向导生成,则位于底部)请参阅MSDN文章:http://msdn.microsoft.com/en-us/library/4tc639ss.aspx
https://stackoverflow.com/questions/1191012
复制相似问题