gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:01:14 24 4
gpt4 key购买 nike

我正在构建一个具有类工厂类型的 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 的类的实例。接口(interface)通过 NumberFactory .

这很好用,但我不知道如何定义和实例化通过 NumberFactory.GetNumber() 返回的 ATL 对象。方法。如果我这样定义 IDL 中的数字:
[ uuid(...) ]
coclass One {
[default] interface INumber;
}
One coclass 可以由用户实例化。但我想限制它,这样你才能获得 One 的实例。 coclass 是通过调用 NumberFactory.GetNumber("One") .

所以我的问题是:IDL 应该怎么写才能让用户无法实例化 One ,但仍然可以实例化 One然后从内部 NumberFactory coclass 并返回 INumber One的界面给用户?

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

最佳答案

  • 从 IDL 中删除 CoClass
  • 从对象表中删除 CoClass(删除其 OBJECT_ENTRY_AUTO)
  • 保留 CNumber 类
  • 您的 GetNumber(...) 代码应类似于:

  • *pVal = new CComObject<CNumber>();  
    (*pVal)->AddRef();


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

    关于com - 如何防止在 ATL 类型库中公开 coclass 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1191012/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com