Com 如何防止在ATL类型库中公开coclass实现
我正在用类工厂的类型构建一个ATL类型库。有点像这样:Com 如何防止在ATL类型库中公开coclass实现,com,atl,idl,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([i
[ 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;
}
[ uuid(...) ]
coclass One {
[default] interface INumber;
}
然后,用户可以通过NumberFactory
获取实现INumber
接口的类的实例
这很管用,但我不知道如何定义和实例化通过NumberFactory.GetNumber()方法返回的ATL对象。如果我这样定义IDL中的数字:
[ 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;
}
[ uuid(...) ]
coclass One {
[default] interface INumber;
}
One
coclass可以由用户实例化。但是我想限制它,因此获得One
coclass实例的唯一方法是调用NumberFactory.GetNumber(“One”)
所以我的问题是:应该如何编写IDL,以便用户不能实例化One
,但仍然能够从NumberFactory
类中实例化One
,并将One
的INumber
接口返回给用户
此外,在ATL方面是否有什么特殊的事情必须要做才能让它起作用?显然,我在寻找错误的东西。。。我在一个相关的问题中找到了答案(从侧边栏),尽管我在提问前搜索时找不到答案
答案有两个方面:
将不可处理添加到IDL中的coclass定义中
从ATL头文件中删除OBJECT\u ENTRY\u AUTO
条目(如果由向导生成,则位于底部)
请参阅此MSDN文章:
从IDL中卸下CoClass
从对象表中删除CoClass(删除其对象\u条目\u自动)
保持CNumber类
GetNumber(…)的代码应该如下所示:
*pVal=new ccombject();
(*pVal)->AddRef();
这样,用户就不需要创建CoClass,只有您的工厂可以生产它们。太棒了!这正是我需要的!谢谢这实际上比我发现的做得更好,哈哈……您还需要从CComCoClass中删除继承。实际上,nonreatable
属性是声明PublicNotCreatable类的更好方法,因为您可以定义源接口,并允许[VB6]客户机使用coclass中的事件调暗。否则,客户端必须果断地使用接口。