在实践中碰到一些问题,弄了好久也无法解决,特向大家咨询:
  我的程序(vc)中使用了一个用vb开发的组件,这个组件里面用到了一个三维控件(OLE控件),它以变量的形式出现在组件中. 现在我在vc中使用这个组件,组件初始化的时候,需要设置这个控件的变量,组件提供的设置该变量的方法是
SetVRscene(IDispatch** arg),
 我在外面的程序使用了这个控件一个对象CVrscene m_Vrscene(Ole控件,派生自CWnd),这个控件用于三维显示用,我怎么才能将它传递到组件里面去,作为组件的变量啊?我使用了强制转换,结果不成功,我又得到控件的IUNKONW指针,然后通过这个指针查询到IVrscene接口指针.然后将这个指针强制转换为IDispatch* 然后传入,也不行.
清大家帮我解答下疑难,不胜感激,谢谢!

解决方案 »

  1.   

    因为你是用MFC的CWnd类包装了该控件.是不能直接转换的
    //
    因为该控制的实际对象是由CWnd::m_pCtrlSite创建的.
    通常情况下是保存在COleCtrlSite::m_pObject中的.
    ///////////////////////////////////////////////////////
    所以你要访问该接口必须先查m_pCtrlSite->m_pObject.有效否.
    再m_pObject->QueryInterface( IID_IDispatch, (void**)&ppOut );// 或IUnknown的接口
    //查询代码应该放在这个包装类中,比如,增加一个QueryInterface.
    //
    HRESULT  YourCtrl::QueryInterface( const IID& riid, void** ppOut )
    {
          if( ppOut == NULL ) return E_INVALIDARG;
          if( m_pCtrlSite == NULL ) return *ppOut = 0, E_NOINTERFACE;
          if( m_pCtrlSite->m_pObject == NULL) return *ppOut = 0, E_NOINTERFACE;
          return m_pCtrlSite->m_pObject->QueryInterface( riid, ppOut );

    //////////////////////////////////////////////////////
    使用大概可以这样
    CComPtr< Ixxxxx > spXXX;
    HRESULT hr = YourCtrl.QueryInterface( IID_IDispatch, (void**)&spXXX );
    if( FAILED( hr) || spXXX == NULL ) return ; // Error
    vbCtrl.SetVRscene((IDispatch**)&spXXX );