ATL COM +使用接口作为参数

时间:2013-11-04 14:59:04

标签: c++ visual-c++ com atl com+

我的项目有两个接口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作为参数会导致安全问题。我不记得我在哪里读。

真的有可能吗? 可以将接口用作参数或不推荐使用吗?

欢迎收到文章。

1 个答案:

答案 0 :(得分:2)

如果将指针作为参数传递给接口,则被调用者将引用实现该接口的对象,并可以自由存储指针并调用QueryInterface以获取指向任何其他接口的指针由该对象实现。

安全隐含的是,如果您不信任被调用者不这样做,您希望传递一个代理对象来强制执行您需要的安全性约束(即不支持任何额外接口的QI,并且具有“关闭“撤销访问的方法”。

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

这通常是一个坏主意:

  • 无法保证即使在同一进程或线程中,您实际上也会传递相同的对象。一些调试器强制公寓之间的进程分离,以便捕获非法访问。
  • 您的实施不需要了解CObjectContext的实施情况。如果是,则表示IObjectContext缺少功能。
  • 如果您直接访问具体实现中的方法而不是通过COM,则可能会混淆内部管理,最终会导致在某个线程上下文中无效的句柄。调试这些很难。