先定义了两个接口,分别是集合(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...语句,郁闷!!!
请教高手问题出在哪里?

解决方案 »

  1.   

    #define DISPID_NEWENUM ( -4 )
    This dispid is used by visual basic to implement for-each syntax. but you are using -5.
      

  2.   

    to masterz:
    非常感谢提醒,但是现在我把dispid改成-4,Item方法仍是不认,请问何故?
    而且VB运行到For each...时,出现错误!VB代码如下:
        Dim MyCol As TestColl
        Dim MyObj As TestItem
        Dim it As TestItem
        Dim str1 As String
        
        Set MyCol = CreateObject("Collections.TestColl")
        For i = 1 To 4
            Set it = New TestItem
            it.token = i
            MyCol.Add it
        Next i
        
        str1 = "The number of coll is:" & MyCol.Count
        MsgBox str1        For Each MyObj In MyCol    《-----此处出错:Automation error:The Object invoked has disconnected from its client.-----》
            List1.AddItem Str(MyObj.token)
        Next
      

  3.   

    我大概知道错误出在哪里了,但是我不知道如何改
    应该是pVar->Init(&m_var[0],&m_var[m_numObjs],NULL,AtlFlagCopy);这里
    第三个参数不应该是NULL,但是我不知道应该传递什么给它。
    Help......