Пропадает std::list
От: ef1 Россия  
Дата: 05.12.05 11:50
Оценка:
Не подскажете, запутался:
в своем классе определяю лист
typedef std::list<CAcadDocumentWrapper> lDocumentsList;       
    lDocumentsList mListDocs;    
typedef std::list <CAcadDocumentWrapper>::iterator Iter;
        Iter IterDocs;
typedef std::list <CAcadDocumentWrapper>::const_iterator ConstIter;
    ConstIter pIterADoc;

в листе храняться врапперы COM интерфейса Document сервера AutoCAD, и в моем классе есть функция работающая с этим листом
void CMyAutoCAD::Refresh()
{ 
...
    if (!mListDocs.empty())
    {                                                                        
    for (pIterDocs = mListDocs.begin(); pIterDocs != mListDocs.end(); pIterDocs++ )
        {
        if (pIterDocs!=pIterADoc)
        mListDocs.erase(pIterDocs);
            }
    }
    else
...

и получается когда я вызываю функцию Refresh() из своего (родительского) класса — все работает массив заполняется/удаляется/имеет размер, а когда я затем вызываю ее-же из класса (определеного в родительском как указатель на класс обрабатывающий события сервера) через указатель на родительский — list оказывается неинициализирован и работать с ним нельзя, а почему?? (вылетает уже на строчке с проверкой листа на то что он не пустой)
Re: Пропадает std::list
От: crable США  
Дата: 05.12.05 12:12
Оценка:
Здравствуйте, ef1, Вы писали:

ef1>Не подскажете, запутался:

ef1>в своем классе определяю лист
ef1>
ef1>typedef std::list<CAcadDocumentWrapper> lDocumentsList;       
ef1>    lDocumentsList mListDocs;    
ef1>typedef std::list <CAcadDocumentWrapper>::iterator Iter;
ef1>        Iter IterDocs;
ef1>typedef std::list <CAcadDocumentWrapper>::const_iterator ConstIter;
ef1>    ConstIter pIterADoc;
ef1>

И зачем typedef, если все равно им не пользуешься?

ef1>в листе храняться врапперы COM интерфейса Document сервера AutoCAD, и в моем классе есть функция работающая с этим листом

ef1>
ef1>void CMyAutoCAD::Refresh()
ef1>{ 
ef1>...
ef1>    if (!mListDocs.empty())
ef1>    {                                                                        
ef1>    for (pIterDocs = mListDocs.begin(); pIterDocs != mListDocs.end(); pIterDocs++ )
ef1>        {
ef1>        if (pIterDocs!=pIterADoc)
ef1>        mListDocs.erase(pIterDocs); //После erase, pIterDocs больше некорректен, и делать с ним ничего нельзя, в т.ч. инкремент.
ef1>            }
ef1>    }
ef1>    else
ef1>...
ef1>

ef1>и получается когда я вызываю функцию Refresh() из своего (родительского) класса — все работает массив заполняется/удаляется/имеет размер, а когда я затем вызываю ее-же из класса (определеного в родительском как указатель на класс обрабатывающий события сервера) через указатель на родительский — list оказывается неинициализирован и работать с ним нельзя, а почему?? (вылетает уже на строчке с проверкой листа на то что он не пустой)

Исправь Refresh (см. комментарий в коде), если не поможет, приведи минимальный код с проблемой.
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re[2]: Пропадает std::list
От: ef1 Россия  
Дата: 05.12.05 12:36
Оценка:
Здравствуйте, crable, Вы писали:
приведу мин. код (просто много классов), но скажи сначала, у меня уже при вызове этой функции (из класса событий сервера) на строчке if (!mListDocs.empty()) происходит ошибка
"Unhandled exception at 0x77f813b1 in ... User breakpoint." т.к. лист mListDocs почему-то уже не существует, ни одного итератора тоже нет? т.е. при вызове функции внутри класса все ок, а стоит вызвать функцию со стороны и листа уже нет
Re[3]: Пропадает std::list
От: crable США  
Дата: 05.12.05 12:46
Оценка:
Здравствуйте, ef1, Вы писали:

ef1>Здравствуйте, crable, Вы писали:

ef1>приведу мин. код (просто много классов), но скажи сначала, у меня уже при вызове этой функции (из класса событий сервера) на строчке if (!mListDocs.empty()) происходит ошибка
ef1>"Unhandled exception at 0x77f813b1 in ... User breakpoint." т.к. лист mListDocs почему-то уже не существует, ни одного итератора тоже нет? т.е. при вызове функции внутри класса все ок, а стоит вызвать функцию со стороны и листа уже нет

Ну может у тебя Refresh уже один раз отработала и list испортился. Без кода мне лень думать, что там происходит.
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re[4]: Код
От: ef1 Россия  
Дата: 05.12.05 13:23
Оценка:
Ok
Мой класс здесь у меня реализован клиент
//CMyAutoCAD.h
{
class CMyAutoCAD : public CWnd
...
    IAcadApplicationPtr     pIAcadApp;                        //указатель на интерфейс AutoCAD Application
    CComPtr<IAcadDocuments> pIAcadDocs;                       //указатель на интерфейс коллекции Документов     

CComObject<CMyAutoCADEvents>*  pAutoCADEvents;               //указатель на класс с событиями
...
typedef std::list<CAcadDocumentWrapper> lDocumentsList;      //лист для хранения врапперов - класс состоящий из COM интерфейса Документ + его события     
    lDocumentsList        mListDocs;                
typedef std::list <CAcadDocumentWrapper>::iterator Iter;
    Iter                    pIterDocs;
typedef std::list <CAcadDocumentWrapper>::const_iterator ConstIter;
    ConstIter                pIterADoc;
...
};
//CMyAutoCAD.cpp
...
void CMyAutoCAD::Refresh()
{  
    HRESULT hr=S_OK;
    for( int i = 0; i<pIAcadDocs->Count; i++ )
        {
            CAcadDocumentWrapper m_AcadDocWr;                               //создать объект класса 
            hr=pIAcadDocs->Item(CComVariant(i), &m_AcadDocWr.pIAcadDoc);    //получить указатель на документ
            mListDocs.push_back(m_AcadDocWr);                               //добавить к листу
            m_AcadDocWr.Release();                                          //удалить объект класса
        }
}
...

класс обработки событий сервера
//CMyAutoCADEvents
class ATL_NO_VTABLE CMyAutoCADEvents : 
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CMyAutoCADEvents, &CLSID_MyAutoCADEvents>,
    public IDispatchImpl<IMyAutoCADEvents, &IID_IMyAutoCADEvents, &LIBID_dbLinkDecoderLib, 1, 0>,
    public IDispEventImpl<0, CMyAutoCADEvents, &DIID__DAcadApplicationEvents, &LIBID_AutoCAD, 1,0>
{
...
STDMETHOD(onEvent_OnNewDrawing)()
{
    pMyAutoCADPtr->Refresh();                        //пересобрать список std::list
    return NOERROR;
};
STDMETHOD(onEvent_OnBeginOpen)(BSTR* FileName)
{
    pMyAutoCADPtr->Refresh();                        //пересобрать список std::list
    return NOERROR;
}; 

    CMyAutoCAD*        pMyAutoCADPtr;                                //указатель на родительский класс

...
}

В общем не вдаваясь в подробности как то так, но дело в том что при таком вызове у меня пропали указатели и на мои COM интерфейсы
т.е. дело не в листе а в том что указатель на родительский класс как то не так работает, в а в чем дело не пойму?
Re[5]: Код
От: ef1 Россия  
Дата: 05.12.05 14:02
Оценка:
т.е. как я понял система такая — есть сервер AutoCAD с событийными интерфейсами из #import
1 пишу клиента
2 создаю указатель на событийный интерфейс AutoCAD и все интерфейсы которые мне нужны
3 привязываюсь к событиям через указатель
4 отлавливаю событие из AutoCAD
5 хочу использовать обработчик этого событи для вызова метода моего клиента (вот тут то и не знаю, получается, что написать)
ладно спасибо за ответы в общем не знаю и не буду других грузить
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.