0

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

使用接口作为参数的一种方法是:

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

    if(ctx!=NULL)
       ...
}

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

真的有可能吗?接口可以作为参数使用还是不推荐?

欢迎文章。

4

1 回答 1

2

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

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

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

这通常是一个坏主意:

  • 无法保证即使在同一个进程或线程中,您实际上会传递同一个对象。一些调试器强制执行单元之间的进程分离,以捕获非法访问。
  • 您的实现不需要了解CObjectContext. 如果是这样,那IObjectContext就是缺少功能的标志。
  • 如果您直接访问具体实现中的方法而不是通过 COM,您可能会混淆内部管理,最终导致在某个线程上下文中无效的句柄。调试这些很难。
于 2013-11-04T16:11:01.647 回答