http://msdn.microsoft.com/zh-cn/magazine/cc163361.aspx 这是msdn关于COM连接点的文章,我下载了其中的例子,编译运行一切都正常,不过我发现一个问题,接收器的实例:class CSink : _IAddEvents
{
private:
DWORD m_dwRefCount;
public: CSink::CSink() {m_dwRefCount = 0;}
CSink::~CSink() {} HRESULT STDMETHODCALLTYPE AdditionStarted()
{
printf("C++ SINK: Addition started event fired ... \n");
return S_OK;;
}; HRESULT STDMETHODCALLTYPE AdditionCompleted(int nResult)
{
printf("C++ SINK: Addition completed event fired ... \n");
printf("C++ SINK: Addition result: %d \n",nResult);
return S_OK;
}; HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject)
{
m_dwRefCount++;
*ppvObject = (void *)this;
return S_OK;
}; ULONG STDMETHODCALLTYPE AddRef()
{
m_dwRefCount++;
return m_dwRefCount;
};
ULONG STDMETHODCALLTYPE Release()
{
ULONG l;
l = m_dwRefCount--;
if ( 0 == m_dwRefCount)
{
delete this;
}
return m_dwRefCount;
}; HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pI)
{
return E_NOTIMPL;
}; HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid,
OLECHAR FAR* FAR* rgszNames,
unsigned int cNames,
LCID lcid,
DISPID FAR* rgDispId)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTinfo, LCID lcid, ITypeInfo FAR **ppTIinfo)
{
return E_NOTIMPL;
} HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS FAR* pDispParams,
VARIANT FAR* pVarResult,
EXCEPINFO FAR* pExcepInfo,
unsigned int FAR* puArgErr)
{
HRESULT hr = S_OK;
if(pDispParams)
{
switch (dispIdMember)
{
case 1:
return AdditionStarted();
case 2:
return AdditionCompleted(pDispParams->rgvarg[0].iVal);
default:
return E_NOTIMPL;
}
}
return E_NOTIMPL;
}
};在使用时是 pSink = new CSink(); 但程序中却没有delete ,我觉得这样有可能会导致内存泄露,我在最后加了 delete pSink;
pSink = new CSink();;
if ( NULL == pSink ) { return; } // Get the interface pointer to CSink's IUnknown pointer which we
// will pass to the server
//
hr = pSink->QueryInterface (IID_IDispatch,(void **)&pSinkUnk);
if(!SUCCEEDED(hr)) { return;}
// Pass the sink interface to the server through the Advise
//
hr = pCP->Advise(pSinkUnk,&dwAdvise);
if(!SUCCEEDED(hr)) { return;} // Call a method on the server and forget it. We should
// get an event back to our sink method that we registered
// through Advise
//
pAdd->Add(1, 5);
// Unadvise the event call back we registered.
//
if(pCP != NULL) { pCP->Unadvise(dwAdvise); } if(pSinkUnk != NULL) { pSinkUnk->Release();} // Disconnect from the server
//
if(pCP != NULL) { pCP->Release(); }
// Release interfaces
//
if(pAdd != NULL) { pAdd->Release(); } delete pSink; CoUninitialize();
return;不过程序却在这句出错了,本人com水平有限,请问各位大侠,为什么new出来的实例,delete会出错呢?
{
private:
DWORD m_dwRefCount;
public: CSink::CSink() {m_dwRefCount = 0;}
CSink::~CSink() {} HRESULT STDMETHODCALLTYPE AdditionStarted()
{
printf("C++ SINK: Addition started event fired ... \n");
return S_OK;;
}; HRESULT STDMETHODCALLTYPE AdditionCompleted(int nResult)
{
printf("C++ SINK: Addition completed event fired ... \n");
printf("C++ SINK: Addition result: %d \n",nResult);
return S_OK;
}; HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject)
{
m_dwRefCount++;
*ppvObject = (void *)this;
return S_OK;
}; ULONG STDMETHODCALLTYPE AddRef()
{
m_dwRefCount++;
return m_dwRefCount;
};
ULONG STDMETHODCALLTYPE Release()
{
ULONG l;
l = m_dwRefCount--;
if ( 0 == m_dwRefCount)
{
delete this;
}
return m_dwRefCount;
}; HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pI)
{
return E_NOTIMPL;
}; HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid,
OLECHAR FAR* FAR* rgszNames,
unsigned int cNames,
LCID lcid,
DISPID FAR* rgDispId)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTinfo, LCID lcid, ITypeInfo FAR **ppTIinfo)
{
return E_NOTIMPL;
} HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS FAR* pDispParams,
VARIANT FAR* pVarResult,
EXCEPINFO FAR* pExcepInfo,
unsigned int FAR* puArgErr)
{
HRESULT hr = S_OK;
if(pDispParams)
{
switch (dispIdMember)
{
case 1:
return AdditionStarted();
case 2:
return AdditionCompleted(pDispParams->rgvarg[0].iVal);
default:
return E_NOTIMPL;
}
}
return E_NOTIMPL;
}
};在使用时是 pSink = new CSink(); 但程序中却没有delete ,我觉得这样有可能会导致内存泄露,我在最后加了 delete pSink;
pSink = new CSink();;
if ( NULL == pSink ) { return; } // Get the interface pointer to CSink's IUnknown pointer which we
// will pass to the server
//
hr = pSink->QueryInterface (IID_IDispatch,(void **)&pSinkUnk);
if(!SUCCEEDED(hr)) { return;}
// Pass the sink interface to the server through the Advise
//
hr = pCP->Advise(pSinkUnk,&dwAdvise);
if(!SUCCEEDED(hr)) { return;} // Call a method on the server and forget it. We should
// get an event back to our sink method that we registered
// through Advise
//
pAdd->Add(1, 5);
// Unadvise the event call back we registered.
//
if(pCP != NULL) { pCP->Unadvise(dwAdvise); } if(pSinkUnk != NULL) { pSinkUnk->Release();} // Disconnect from the server
//
if(pCP != NULL) { pCP->Release(); }
// Release interfaces
//
if(pAdd != NULL) { pAdd->Release(); } delete pSink; CoUninitialize();
return;不过程序却在这句出错了,本人com水平有限,请问各位大侠,为什么new出来的实例,delete会出错呢?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货