一个
class ATL_NO_VTABLE CTwo : 
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CTwo, &CLSID_Two>,
public IDispatchImpl<ITwo, &IID_ITwo, &LIBID_ALTCOMLib>
{
public:
CTwo()
{
}
...
另一个
class ATL_NO_VTABLE COne : 
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<COne, &CLSID_One>,
public IConnectionPointContainerImpl<COne>,
public IDispatchImpl<IOne, &IID_IOne, &LIBID_ALTCOMLib>
{
public:
COne()
{
}
CComPtr<ITwo>m_Two;
....
// IOne
public:
STDMETHOD(GetTwo)(/*[out]*/IDispatch **p); STDMETHOD(Add)(/*[in]*/int a);
}
我要实现在Ione接口里调用GetTwo方法生成一个新的ITwo接口返回给用户实现代码如下:
STDMETHODIMP COne::GetTwo(IDispatch **p)
{
// TODO: Add your implementation code here
 
 //=new CTwo();
 HRESULT hr=m_Two.CoCreateInstance(__uuidof(Two), NULL,
CLSCTX_INPROC_SERVER); 
 
 p=(IDispatch **)&m_Two; return S_OK;
}调试代码:
::CoInitialize(NULL); 
  HRESULT hr=m_One.CoCreateInstance(__uuidof(One), NULL,
CLSCTX_INPROC_SERVER);   if(!SUCCEEDED(hr))  
   {  
    AfxMessageBox("無法創建One對象,請檢查是否安裝了MS XML運行庫!");  
   }
   else
   {
   m_One->GetTwo((IDispatch **)&m_Two);
   m_Two->Test2(6);
  /* BSTR p;
   m_Two->GetStr(&p);
   
   CString ReturnStr;
   ReturnStr=static_cast<CString>(p);
   */
  // AfxMessageBox(ReturnStr);
    m_One->Add(123);
    m_One.Release(); 
::CoUninitialize(); 
发现调用m_One->GetTwo((IDispatch **)&m_Two);后m_Two始终是空的不知道是啥原因,望COM高手指正

解决方案 »

  1.   

    以上测试代码只运行一次所以不存在在IONE接口里:m_Two建立多次现象
      

  2.   

    COne::GetTwo(IDispatch **p)函数里的成员CComQIPtr m_Two,在反回后也不存在,也调用析构函数,所以p=(IDispatch **)&m_Two;不起作用,为NULL了。
      

  3.   

    楼上回复是错误。
    把COne中的
    CComPtr<ITwo>m_Two;
    定义改为
    CComQIPtr<ITwo, IID_ITwo> m_Two;试试。
      

  4.   

    同时改
    STDMETHODIMP COne::GetTwo(IDispatch **p)
    {
    // TODO: Add your implementation code here
     HRESULT hr=m_Two.CoCreateInstance(__uuidof(Two), NULL,
    CLSCTX_INPROC_SERVER); if(成功)
     
     p=(IDispatch **)&m_Two.Detach(); return S_OK;
    }
      

  5.   

    再改
    p=(IDispatch **)&m_Two.Detach();

    *p=(IDispatch *)m_Two.Detach();
      

  6.   

    CComQIPtr<ITwo, IID_ITwo> m_Two;定义就出错
      

  7.   

    改为:CComQIPtr<ITwo, &IID_ITwo> m_Two
    经过测试还是返回为空
      

  8.   

    zxyjyzxyjy(星星)的方法你试了吗?
    p=(IDispatch **)&m_Two.Detach();绝对是不可以的,传值和传址的区别要记牢哦
      

  9.   

    STDMETHODIMP COne::GetTwo(/*[out]*/ITwo** pprec)
    {
         CComObject<CTwo>* pobj = 0;
         HRESULT hr = CComObject<CTwo>::CreateInstance(&pobj);
         if(SUCCEEDED(hr))
         {
              pobj->AddRef();
              pobj->Init(...);   // 初始化对象的内容
              hr = pobj->QueryInterface(IID_ITwo, (void**)pprec);
              pobj->Release();
         }
         return hr;
    }