描述:
先定义了两个接口,分别是集合(ITestColl)和内部对象(ITestItem)
interface ITestColl : IDispatch
{
[id(0), helpstring("method Item")] HRESULT Item([in]VARIANT Index,[out,retval]ITestItem** pItem);
[id(1), helpstring("method Add")] HRESULT Add([in]ITestItem** NewObj );
[propget, id(2), helpstring("property Count")] HRESULT Count([out, retval] long *pVal);
[id(3), helpstring("method Remove")] HRESULT Remove(VARIANT Index);
[id(4), helpstring("method Clear")] HRESULT Clear();
[propget, id(-5), restricted, hidden, helpstring("property _NewEnum")] HRESULT _NewEnum([out, retval] LPUNKNOWN *pVal);
};
...
interface ITestItem : IDispatch
{
[id(1), helpstring("method method")] HRESULT method();
[propget, id(2), helpstring("property token")] HRESULT token([out, retval] short *pVal);
[propput, id(2), helpstring("property token")] HRESULT token([in] short newVal);
};
...
ITestColl的实现如下:
typedef CComObject<CComEnum<IEnumVARIANT,&IID_IEnumVARIANT,VARIANT,_Copy<VARIANT> > > EnumVar;
STDMETHODIMP CTestColl::Item(VARIANT Index, ITestItem** pItem)
{
// TODO: Add your implementation code here
if(Index.lVal<0||Index.lVal>m_numObjs)
return E_FAIL;
*pItem=(ITestItem*)m_var[Index.lVal].pdispVal;
return S_OK;
}
STDMETHODIMP CTestColl::Add(ITestItem** NewObj)
{
// TODO: Add your implementation code here
if(m_Index<m_numObjs)
{
m_var[m_Index].vt=VT_DISPATCH;
//*NewObj->QueryInterface(IID_IDispatch,&m_var[m_Index++].pdispVal);
m_var[m_Index++].pdispVal=*NewObj;
return S_OK;
}
return E_FAIL;
}
STDMETHODIMP CTestColl::get_Count(long *pVal)
{
// TODO: Add your implementation code here
*pVal=m_Index;
return S_OK;
}
STDMETHODIMP CTestColl::get__NewEnum(LPUNKNOWN *pVal)
{
// TODO: Add your implementation code here
EnumVar *pVar=new EnumVar;
pVar->Init(&m_var[0],&m_var[m_numObjs],NULL,AtlFlagCopy);
pVar->QueryInterface(IID_IUnknown,(void**)pVal);
return S_OK;
}
void CTestColl::FinalRelease()
{
if (m_var)
{
delete []m_var;
}
}
...
但是在VB中调用是,总是说不支持Item方法和For Each...语句,郁闷!!!
请教高手问题出在哪里?