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

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

我正在用类工厂的类型构建一个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;
}
[ 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中的事件调暗。否则,客户端必须果断地使用接口。