в листе храняться врапперы 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 оказывается неинициализирован и работать с ним нельзя, а почему?? (вылетает уже на строчке с проверкой листа на то что он не пустой)
И зачем 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.
Здравствуйте, crable, Вы писали:
приведу мин. код (просто много классов), но скажи сначала, у меня уже при вызове этой функции (из класса событий сервера) на строчке if (!mListDocs.empty()) происходит ошибка
"Unhandled exception at 0x77f813b1 in ... User breakpoint." т.к. лист mListDocs почему-то уже не существует, ни одного итератора тоже нет? т.е. при вызове функции внутри класса все ок, а стоит вызвать функцию со стороны и листа уже нет
Здравствуйте, 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.
//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(); //удалить объект класса
}
}
...
класс обработки событий сервера
//CMyAutoCADEventsclass 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::listreturn NOERROR;
};
STDMETHOD(onEvent_OnBeginOpen)(BSTR* FileName)
{
pMyAutoCADPtr->Refresh(); //пересобрать список std::listreturn NOERROR;
};
CMyAutoCAD* pMyAutoCADPtr; //указатель на родительский класс
...
}
В общем не вдаваясь в подробности как то так, но дело в том что при таком вызове у меня пропали указатели и на мои COM интерфейсы
т.е. дело не в листе а в том что указатель на родительский класс как то не так работает, в а в чем дело не пойму?
т.е. как я понял система такая — есть сервер AutoCAD с событийными интерфейсами из #import
1 пишу клиента
2 создаю указатель на событийный интерфейс AutoCAD и все интерфейсы которые мне нужны
3 привязываюсь к событиям через указатель
4 отлавливаю событие из AutoCAD
5 хочу использовать обработчик этого событи для вызова метода моего клиента (вот тут то и не знаю, получается, что написать)
ладно спасибо за ответы в общем не знаю и не буду других грузить