我有一个对象集合,定义为:
typedef IField ItemInterface;
typedef CComObject<CField>* ItemClassPtr;
typedef CAdapt< CComPtr<ItemInterface> > ItemType;
typedef std::vector< ItemType > ContainerType;
我通过一系列调用创建了几个 CField 对象(忽略 hresult):
IField* ppField = 0;
hresult = CField::CreateInstance(&ppField);
ItemType spField = ppField;
m_coll.push_back(spField);
ppField->Release();
现在我正在尝试检索指向对象的指针,以便可以调用其中一个方法:
ItemClassPtr pField;
short type1;
m_coll[index].m_T->QueryInterface( __uuidof(ItemInterface), (void **)&pField ) );
pField->get_Type(&type1);
它在 get_Type 调用时因访问冲突而崩溃。这是响应响应者的帖子而更改的:
short type1;
IField * ppField = m_coll[index].m_T;
CComQIPtr<CField, &__uuidof(IField)> pField = ppField;
pField->get_Type(&type1);
但是当我尝试跟踪 get_Type 调用时它仍然崩溃。
这是 CField 类定义的序言:
class ATL_NO_VTABLE CField :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CField, &CLSID_Field>,
public ISupportErrorInfo,
public IFieldAccess,
public IDispatchImpl<IField, &IID_IField, &LIBID_SQLite02>
{
friend class CFields;
friend class CrecordSet;
public:
CField();
~CField();
DECLARE_REGISTRY_RESOURCEID(IDR_FIELD)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CField)
COM_INTERFACE_ENTRY(IField)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY_IID(__uuidof(IField), CField)
END_COM_MAP()
请帮忙!
请注意,此问题是上一个 ATL 问题的一个分支In ICollectionOnSTLImpl implementation, can't access m_T or item object's members 这更全面地描述了集合类。我已经用 typedefs 替换了#defines。
万斯