4

我正在构建一个具有类工厂类型的 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;
}

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

所以我的问题是:应该如何编写 IDL 以便用户无法实例化One,但仍然能够OneNumberFactorycoclass 内部实例化并将INumber接口返回One给用户?

此外,为了使其工作,在 ATL 方面是否必须做任何特别的事情?

4

2 回答 2

4
  1. 从 IDL 中删除 CoClass
  2. 从对象表中删除 CoClass(删除其 OBJECT_ENTRY_AUTO)
  3. 保留 CNumber 类
  4. 您的 GetNumber(...) 代码应类似于:
*pVal = new CComObject<CNumber>();  
(*pVal)->AddRef();

这样,用户就无需创建 CoClass,而您的工厂是唯一可以生产它们的工厂。

于 2009-07-28T06:24:38.470 回答
1

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

答案有两个:

  1. 添加noncreatable到 IDL 中的 coclass 定义
  2. 从 ATL 头文件中删除OBJECT_ENTRY_AUTO条目(如果由向导生成,则在底部)

请参阅此 MSDN 文章:http: //msdn.microsoft.com/en-us/library/4tc639ss.aspx

于 2009-07-27T23:05:29.817 回答