我正在尝试通过VC6实现可由VB6程序访问的对象集合。我无法将它聚集在一起。
我已经定义了_CopyVariantFromAdaptItf和_CopyItfFromAdaptItf(来自“ATL internals”)。 以下是我在集合定义中使用的定义:
#define CComEnumVariantOnListOfItemInterface(ItemInterface) \
CComEnumOnSTL<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT,_CopyVariantFromAdaptItf<ItemInterface>,vector< CAdapt< CComPtr<ItemInterface> > > >
#define ClassInterfaceCollImpl(ContainerInterface,ItemInterface) \
ICollectionOnSTLImpl< IDispatchImpl< ContainerInterface, &__uuidof(ContainerInterface) >,\
vector< CAdapt< CComPtr<ItemInterface> > >,ItemInterface*,_CopyItfFromAdaptItf<ItemInterface>,\
CComEnumVariantOnListOfItemInterface(ItemInterface) >
#define ContainerInterface IFields
#define ContainerClass CFields
#define ContainerClsid CLSID_Fields
#define ItemInterface IField
#define DllRegID IDR_FIELDS
typedef std::vector< CAdapt< CComPtr<ItemInterface> > > ContainerType;
这是容器类的前言:
class ATL_NO_VTABLE ContainerClass :
public ClassInterfaceCollImpl(ContainerInterface,ItemInterface),
public ISupportErrorInfo,
public CComObjectRoot,
public CComCoClass<ContainerClass,&ContainerClsid>
{
public:
ContainerClass();
BEGIN_COM_MAP(ContainerClass)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ContainerInterface)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()
//DECLARE_NOT_AGGREGATABLE(CFields)
// Remove the comment from the line above if you don't want your object to
// support aggregation.
DECLARE_REGISTRY_RESOURCEID(DllRegID)
// ISupportsErrorInfo
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
// IFields
private:
int GetIndex( BSTR name );
等...
在我尝试的实现中,我正在尝试扫描包含的对象,以查找在对象的函数pName()中访问的匹配名称。请注意,我展示了我尝试过的两种不同的方法:
int CFields::GetIndex( BSTR name )
{
long count = 0;
#if (1)
Count(&count);
for (unsigned int i=0; i<count; i++)
if (wcscmp( name, m_coll.m_T->pName())
return (i);
#else
std::vector<CAdapt<CComPtr<IField> > >::iterator itr;
for (itr = m_coll.begin(); itr != m_coll.end(); itr++)
if (wcscmp( name, itr->m_T->pName()))
count++;
else
return (count);
#endif
throw E_INVALIDARG_13;
}
如果我尝试#if(1),我得到一个错误,m_T不是“vector&lt; ...”的成员。 如果我尝试m_coll-&gt; m_T,我会收到一个错误,“vector&lt; ...”没有超载 - &gt;,这是我所期待的。 如果我尝试#if(0),我得到一个错误,即pName()不是'_NoAddRefReleaseOnCComPtr
的成员提前感谢你们给我的任何帮助!
万斯
答案 0 :(得分:0)
我知道我正在和自己说话,但我希望能帮助别人,以防我偶然发现一个正确的答案。
好的,我有一个工作系统,并根据对另一个问题How to retrieve object pointer from ATL collection of objects?的回复,这就是我最终的结果。我添加了一行:
COM_INTERFACE_ENTRY_IID(CLSID_Fields, CFields)
之间的
BEGIN_COM_MAP(CFields)
和
END_COM_MAP()
行,以便getItemObjectPtr可以工作。
我将ItemInterface更改回IField并将GetIndex方法更改为:
long count = 0;
ContainerType::iterator itr;
for (itr = m_coll.begin(); itr != m_coll.end(); itr++)
if (wcscmp( name, getItemObjectPtr( itr->m_T )->pName()) == 0)
count++;
else
return (count);
throw (HRESULT)E_INVALIDARG_13;
,方法getItemObjectPtr定义为:
CFields * CrecordSet::getItemObjectPtr( IFields *ppFields )
{
CComQIPtr<CFields, &CLSID_Fields> pFields = ppFields;
return (pFields);
}