Collection Copy Policy in ATL8-vs2005
Collection Copy Policy in ATL8-vs2005
I need update my Collection from VC6 to vs2005
but has a error of Collection Copy Policy
IDL File
[
object,
uuid(47958973-CE5C-4E87-9F4E-40EEE01CD1AF),
dual,
nonextensible,
helpstring("IObjA ????"),
pointer_default(unique)
]
interface IObjA : IDispatch{
[propget, id(1), helpstring("???? Objame")] HRESULT Objame([out, retval]
BSTR* pVal);
};
[
uuid(CF3AA015-4FB4-4708-A990-8566CDCB5B48),
helpstring("IEnumCapturedImage Interface"),
dual,
pointer_default(unique),
object
]
interface IEnumObjA : IUnknown
{
typedef [unique] IEnumObjA *LPIEnumObjA;
[local] HRESULT Next([in] ULONG celt, [out] IEnumObjA **rgelt, [out] ULONG
*pceltFetched);
[call_as(Next)] HRESULT RemoteNext([in] ULONG celt, [out,
length_is(*pceltFetched), size_is(celt)] IEnumObjA **rgelt, [out] ULONG
*pceltFetched);
HRESULT Skip([in] ULONG celt);
HRESULT Reset();
HRESULT Clone([out] IEnumObjA **ppenum);
};
[
object,
uuid(260FB548-5B40-42BE-ADB2-88190111E022),
dual,
nonextensible,
helpstring("IObjAs ????"),
pointer_default(unique)
]
interface IObjAs : IDispatch{
[propget, id(DISPID_NEWENUM), restricted] HRESULT _NewEnum([out, retval]
IUnknown **ppUnk);
[propget, id(DISPID_VALUE)] HRESULT Item([in] long Index, [out, retval]
IObjA **pVal);
[propget, id(1)] HRESULT Count([out, retval] long *pVal);
};
ObjAs.h
#include "CollTest1.h"
#include <map>
#include "ObjA.h"
typedef std::map<int, IObjA*> ObjAContainer;
template <class ContainerType, class InterfaceType>
class InterfaceCopy
{
public :
typedef typename ContainerType::value_type SourceType;
static void init(InterfaceType** p)
{
_CopyInterface<InterfaceType>::init(p);
}
static void destroy(InterfaceType** p)
{
_CopyInterface<InterfaceType>::destroy(p);
}
static HRESULT copy(InterfaceType** pTo, SourceType *pFrom )
{
return _CopyInterface<InterfaceType>::copy(pTo, &(pFrom->second));
}
}; // class Interface Copy Policy
typedef InterfaceCopy<ObjAContainer, IObjA> InterfaceCopyPolicy;
typedef CComEnumOnSTL<IEnumObjA, &__uuidof(IEnumObjA), IObjA*,
InterfaceCopyPolicy, ObjAContainer> ObjAEnumerator;
typedef ICollectionOnSTLImpl<IObjAs, ObjAContainer, IObjA*,
InterfaceCopyPolicy, ObjAEnumerator> ObjACollection;
#if defined(_WIN32_WCE) && !defined(_CE_DCOM) &&
!defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Windows CE ????(???????????? DCOM ?????? Windows Mobile ????)???????????????????? COM ?????????? _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA ?????? ATL
?????????????? COM ?????????????????????????? COM ??????????rgs ????????????????????????????Free???????????????????? DCOM Windows CE ????????????????????????"
#endif
// CObjAs
class ATL_NO_VTABLE CObjAs :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CObjAs, &CLSID_ObjAs>,
public ISupportErrorInfo,
public IDispatchImpl<ObjACollection, &IID_IObjAs, &LIBID_CollTest1Lib,
/*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
CObjAs()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_OBJAS)
BEGIN_COM_MAP(CObjAs)
COM_INTERFACE_ENTRY(IObjAs)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()
// ISupportsErrorInfo
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
public:
};
OBJECT_ENTRY_AUTO(__uuidof(ObjAs), CObjAs)
error C2664: 'InterfaceCopy<ContainerType,InterfaceType>::copy' : cannot
convert parameter 2 from 'const std::pair<_Ty1,_Ty2> *__w64 ' to
'std::pair<_Ty1,_Ty2> *'
If I modify code
....
template <class ContainerType, class InterfaceType>
class InterfaceCopy
{
....
....
static HRESULT copy(InterfaceType** pTo, const SourceType *pFrom )
{
return _CopyInterface<InterfaceType>::copy(pTo, &(pFrom->second));
}
}
....
....
error C2664: 'ATL::_CopyInterface<T>::copy' : cannot convert parameter 2
from 'IObjA *const *__w64 ' to 'IObjA **'
Thanks in advance,
ZHP.Henry