次のように定義されたオブジェクトのコレクションがあります。
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();
そして今、オブジェクトへのポインターを取得して、そのメソッドの1つを呼び出そうとしています:
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から派生したものであることに注意してください 。コレクション クラスについてより詳しく説明しています。#define を typedef に置き換えました。
ヴァンス