一个
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高手指正
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高手指正
把COne中的
CComPtr<ITwo>m_Two;
定义改为
CComQIPtr<ITwo, IID_ITwo> m_Two;试试。
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;
}
p=(IDispatch **)&m_Two.Detach();
为
*p=(IDispatch *)m_Two.Detach();
经过测试还是返回为空
p=(IDispatch **)&m_Two.Detach();绝对是不可以的,传值和传址的区别要记牢哦
{
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;
}