在COM接口中怎样返回一个COM对象?
我使用VS2005的ATL开发的。现在YQCall接口类有一个方法CallOut,在idl中的声明如下:
IYQCallSession是另一个接口类,m_CallSessionList是我用来管理生成的IYQCallSession对象的,这些返回对象最后都是我用delete操作来释放的。。。
//idl中的声明
HRESULT CallOut([in] BSTR strNumber, [out,retval] IYQCallSession** pVal);
我的部分实现代码是这样的
STDMETHODIMP CYQCall::CallOut(YQ_CALL_TYPE nCallType, BSTR strNumber, IYQCallSession** pVal)
{
... ...
CComObject<CYQCallSession>* pCallSession = new CComObject<CYQCallSession>;
pCallSession->AddRef();
pCallSession->AddRef();
m_CallSessionList.Add(pCallSession);
*pVal = pCallSession;
... ...
}
至于为什么要加两个AddRef,我都没想明白,反正只有这样才不报错。我现在的代码在我用C++Builder写的测试程序里面一点问题都没有,运行地很正常,但是到VB下面就这样那样的问题,我很郁闷。。。希望给为帮我看看,关于返回对象这个地方是不是有问题,如果真的是我写的COM组件有问题,我所能想到的问题也就是这儿了
[解决办法]
至于为什么要加两个AddRef
从使用D版Turbo C以来直到BCB 6一直有这个类似问题,你在调试状态就可以发现该行代码没有执行点——代码左边的一个小蓝点,解决方法就是加两个一模一样的代码或加一行空格。
[解决办法]
m_CallSessionList.Add(pCallSession);
这里m_CallSessionList的Add函数的实现需要AddRef不知道您加了没?
还有,我一般都用
ICYQCallSession * pCallSession = CoYQCallSession::Create();
来创建COM对象,要不您也是试试?
[解决办法]