STDMETHODIMP CSOActiveX::SetClientSite( IOleClientSite* aClientSite )
{
               HRESULT hr = IOleObjectImpl<CSOActiveX>::SetClientSite( aClientSite );
 
               if( !aClientSite )
               {
                               ATLASSERT( mWebBrowser2 );
                               if( mWebBrowser2 )
                                              AtlUnadvise( mWebBrowser2, DIID_DWebBrowserEvents2, mCookie );
                               return hr;
               }
 
               CComPtr<IOleContainer> aContainer;
               m_spClientSite->GetContainer( &aContainer );
               ATLASSERT( aContainer );
 
               if( SUCCEEDED( hr )  && aContainer )
               {
                               CComQIPtr<IServiceProvider, &IID_IServiceProvider> aServiceProvider( aContainer );
                               ATLASSERT( aServiceProvider );//这里出错
 
                               if( aServiceProvider )
                               {
                                              aServiceProvider->QueryService( SID_SInternetExplorer,
                                                                                                                                                                        IID_IWebBrowser,
                                                                                                                                                                        (void**)&mWebBrowser2 );
                                              ATLASSERT( mWebBrowser2 );
                                              if( mWebBrowser2 )
                                                             AtlAdvise( mWebBrowser2, GetUnknown(), DIID_DWebBrowserEvents2, &mCookie );
                               }
               }
 
               return hr;
}    

解决方案 »

  1.   

    aServiceProvider这个服务端对象这个时候存在吗,检查一下这个对象的内存,是否被提前释放导致断言错误
      

  2.   

    有可能是 从aContainer 就queryinterface 你的IID_IServiceProvider吧,
    你可以先用 CComPtr<IServiceProvider> 先建立这个对象,然后再queryinterface一下,看是否能正常获得。
      

  3.   


    如果是这样的话那 queryinterface 返回的 HRESULT 是 SUCCED 的吗?因为对于CComQIPtr 接口他自己内含 queryintface的,如果query 失败 那么就直接返回 NULL, 如果使用CComPtr 至少可以看到 query 返回的是什么原因代码 。