gpt4 book ai didi

c++ - ATL COM+ 使用接口(interface)作为参数

转载 作者:行者123 更新时间:2023-11-28 03:05:47 24 4
gpt4 key购买 nike

我的项目有两个接口(interface) IObjectContext 和 IObjectFactory。

将接口(interface)用作参数的一种方法是:

interface IObjectFactory: IDispatch{
[id(1)] HRESULT create([in] IObjectContext* context);
}
...
STDMETHODIMP CObjectFactory::create(IObjectContext* context)
{
CObjectContext *ctx= dynamic_cast<CObjectContext*>(context);

if(ctx!=NULL)
...
}

如果我没记错的话,我在某处读到说使用接口(interface)作为参数会导致安全问题。我不记得我在哪里读过的。

真的可以吗?Interface 可以用作参数还是不推荐?

欢迎投稿。

最佳答案

如果您将一个指针作为参数传递给一个接口(interface),被调用者将拥有一个对实现该接口(interface)的对象的引用,并且可以自由地存储该指针并调用QueryInterface。获取指向该对象实现的任何其他接口(interface)的指针。

安全含义是,如果您不相信被调用者不会那样做,您希望传递一个代理对象来强制执行您需要的安全约束(即不支持任何额外接口(interface)的 QI,并且有一个“shutdown"方法来撤销访问权限)。

在您的代码中,您使用 dynamic_cast<>在接口(interface)指针上。

这通常是个坏主意:

  • 即使在同一个进程或线程中,也不能保证您实际上会收到同一个对象。一些调试器在单元之间强制执行进程分离,以捕获非法访问。
  • 您的实现不需要知道 CObjectContext 的实现.如果是,则表明 IObjectContext缺少功能。
  • 如果您直接访问具体实现中的方法而不是通过 COM,您可能会混淆内部管理,最终得到在特定线程上下文中无效的句柄。调试这些很难。

关于c++ - ATL COM+ 使用接口(interface)作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19770494/

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