Тема: Выдает Fatal Error при работе с примитивами и xData.

Народ я тут написал процедурку, которая получает xData, со всех примитивов на чертеже и сравнивает..в принципе вот и все..и про завершении происходит фатал..подскажите плиз, кто смогет..Вот код
int CMainWindow::dbSyncronization()
{
recDelList = CString("");
CDatabase db;
db.OpenEx(str_connect,CDatabase::noOdbcDialog);
CRecordset Rs;
Rs.m_pDatabase = &db;
bool check = false;
AcAxDocLock lock(acdbHostApplicationServices()->workingDatabase());
AcDbBlockTable *pBlkTbl;
acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlkTbl, AcDb::kForRead);
AcDbBlockTableRecord *pBlkTblRcd;
pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd, AcDb::kForRead);
pBlkTbl->close();
Rs.Open(CRecordset::forwardOnly, _T("SELECT ID_COUNT_ FROM PID_Components_Process_Lines WHERE DWG_NAME_ = '" + dwgNameDB + "'"));
int errCount = 0, recCount = 0;
pc_checking->SetRange32(0, Rs.GetRecordCount());
while (!Rs.IsEOF())
{
recCount++;
CString p1, errLine = CString("");
Rs.GetFieldValue(0, p1);
AcDbBlockTableRecordIterator *pBlkTblRcdItr;
pBlkTblRcd->newIterator(pBlkTblRcdItr);
int objCount = 0;
check = false;
pc_checking->SetPos(recCount);
for (pBlkTblRcdItr->start(); !pBlkTblRcdItr->done(); pBlkTblRcdItr->step())
{
objCount++;
CString lineID;
AcDbEntity *pEnt;
pBlkTblRcdItr->getEntity(pEnt, AcDb::kForWrite);
if ((pEnt->isKindOf(AcDbPolyline::desc())) | (pEnt->isKindOf(AcDb2dPolyline::desc())))
{
struct resbuf *pRb, *pTemp;
pRb = pEnt->xData(CString("CFD1"));
if (pRb != NULL)
{
int count = 0;
for (pTemp = pRb; pTemp->rbnext != NULL; pTemp = pTemp->rbnext)
{
count ++;
if (count == 7)
{
lineID = LongToStr(pTemp->resval.rlong);
break;
}
}
}
acutRelRb(pRb);
}
pEnt->close();
errLine = p1;
if (p1 == lineID)
{
check = true;
errLine = "";
break;
}
}
delete pBlkTblRcdItr;
pBlkTblRcd->close();
if ((check == false) & (errLine != CString("")) & (objCount != 0))
{
recDelList += "'" + errLine + "',";
errCount++;
}
if ((check == false) & (objCount == 0))
{
recDelList += "'" + p1 + "',";
errCount++;
}
Rs.MoveNext();
}
Вроде все учел.
Заранее спасибо
Rs.Close();
db.Close();
pc_checking->SetPos(0);
return errCount;
}

Re: Выдает Fatal Error при работе с примитивами и xData.

Сорри ребята не тут косяк...короче фатал есть када пытаюсь изменить цвет примитива..
подскажите плизз..вот код
void lineSelect(CString ID)
{
    AcAxDocLock lock(acdbHostApplicationServices()->workingDatabase(), AcAxDocLock::kNormal);
    if ((lock.lockStatus() != Acad::eOk) | (lock.lockStatus() != Acad::eNoDatabase))
    {
        AcDbBlockTable *pBlkTbl;
        acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlkTbl, AcDb::kForWrite); - МНЕ КАЖЕТСЯ КОСЯК ТУТ!!
        AcDbBlockTableRecord *pBlkTblRcd;
        pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd,  AcDb::kForWrite); - И ТУТ!!
        pBlkTbl->close();
        AcDbBlockTableRecordIterator *pBlkTblRcdItr;
        pBlkTblRcd->newIterator(pBlkTblRcdItr);
        CString lineID = CString("");
        for (pBlkTblRcdItr->start(); !pBlkTblRcdItr->done(); pBlkTblRcdItr->step())
        {   
            AcDbEntity *pEnt;
            pBlkTblRcdItr->getEntity(pEnt, AcDb::kForWrite);
            if ((pEnt->isKindOf(AcDbPolyline::desc())) | (pEnt->isKindOf(AcDb2dPolyline::desc())))
            {
                struct resbuf *pRb, *pTemp;
                pRb = pEnt->xData(CString("CFD1"));
                if (pRb != NULL)
                {
                    int count = 0;
                    for (pTemp = pRb; pTemp->rbnext != NULL; pTemp = pTemp->rbnext)
                    {
                        count ++;
                        if (count == 5)
                        {
                            lineID = pTemp->resval.rstring;
                            break;
                        }
                    }
                }
                acutRelRb(pRb);
                }
            if (ID == lineID)
            {
                pEnt->setColorIndex(7);
                break;
            }
            pEnt->close();
        }
        delete pBlkTblRcdItr;
        pBlkTblRcd->close();
    }
}
Спасибо заранее! сорри что побеспокоил!подскажите свои мысли может найдете че..

Re: Выдает Fatal Error при работе с примитивами и xData.

Хочешь мысли? Пожалуйста:
1) Если уважаешь тех, у кого просишь помощи, то код на форум помещай в теги [code] ... [/code]. Так значительно легче читать и сохраняется форматирование.
2) Никогда не открывай на запись (kForWrite) если не собираешься модифицировать. В данном случае это касается AcDbBlockTable и AcDbBlockTableRecord. Вполне достаточно открыть их для чтения (kForRead), а для записи открывать примитив, который будет модифицироваться.
3) Проверяй результаты выполнения всех методов, а особенно тех которые открывают объект/примитив (типа getSymbolTable, getAt, getEntity)
4) Используй интеллектуальные указатели типа AcDbSymbolTablePointer,  AcDbSymbolTableRecordPointer, AcDbObjectPointer.
5) Не пренебрегай отладкой

Re: Выдает Fatal Error при работе с примитивами и xData.

Пасиб, за мысли)

Re: Выдает Fatal Error при работе с примитивами и xData.

Косяк нашел
...

    if (ID == lineID)
    {
        pEnt->setColorIndex(7);
        pEnt->close(); //вот здесь необходимо закрыть примитив))
        break;
    }
    pEnt->close();

...