【问题标题】:Call QueryInterface before CoCreateInstance?在 CoCreateInstance 之前调用 QueryInterface?
【发布时间】:2010-07-06 15:21:03
【问题描述】:

以上可以吗?

我可以这样做吗:

IUnknown *punk;

punk->QueryInterface(IID_MyInterface, (void**)&m_pMyInterface);

我认为这会告诉我 MyInterface 是否受支持 m_pMyInterface...

【问题讨论】:

    标签: c++ com interface


    【解决方案1】:

    如果你的意思是你上面写的,那么不是:因为你的 punk 是一个未初始化的指针。

    通常你需要调用CoCreateInstance 来创建某个东西的实例;之后,您可以在该实例上调用QueryInterface,询问它支持什么接口。

    【讨论】:

    • 如果 CoCreateInstance 返回 E_NOINTERFACE,那我该怎么办?
    • @Tony 这意味着指定的类不支持那个接口:所以如果你还想创建一个实例,要么指定一个不同的类,要么指定一个不同的接口。
    • @Tony:让 CoCreateInstance 返回 IID_IUnknown,然后做 QueryInterface。
    【解决方案2】:

    你不能那样做。提议的 sn-p 将测试punk 指向的对象是否支持IID_MyInterface 的接口,如果它支持接口指针,则将检索到m_pMyInterface,并且AddRef() 将在检索到的指针上被调用.由于 punk 未初始化,它不指向任何有效对象,因此尝试调用 QueryInterface() 会导致未定义的行为 - 您的程序可能会崩溃。

    为了测试m_pMyInterface 指向的对象是否支持IID_MyInterface 的接口,您需要执行以下操作:

    IUnknown* punk;
    HRESULT hr = m_pMyInterface->QueryInterface(IID_MyInterface, (void**)&punk);
    if( SUCCEEDED( hr ) ) {
       //the interface is supported - don't forget that AddRef() has been called
    } else {
       //the interface is not supported
    }
    

    只有在m_pMyInterface 已经指向一个活动的 COM 对象时才能完成后者。

    【讨论】:

      猜你喜欢
      • 2010-10-13
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 2011-08-26
      • 2012-06-24
      • 2012-01-16
      • 2019-10-19
      相关资源
      最近更新 更多