Тема: eHadMultipleReades [ITERNAL ERROR]

Такой код:

void Lx()
{
    LOCK_DOC;
  ads_name ss;
  long nss = 0;
  Acad::ErrorStatus err;
  if (acedSSGet(NULL,NULL,NULL,NULL,ss) == RTNORM && acedSSLength(ss,&nss) == RTNORM)
  {
    for (long i = 0; i < nss; i++)
    {
      ads_name en;
      if (acedSSName(ss,i,en) != RTNORM) continue;
      AcDbObjectId eid;
      AcDbEntity *pEnt;
      if (acdbGetObjectId(eid,en) != Acad::eOk) continue;
//AcDbObjectPointer<AcDbEntity> pEnt(eid,AcDb::kForRead);
      acdbOpenAcDbEntity(pEnt,eid,AcDb::kForRead);
      //if (pEnt.openStatus() != Acad::eOk) continue;
      CString szFactor,szArt;
      acutPrintf("\nN=%d ",i);
      if (AcDbBlockReference::cast(pEnt))
      {
        AcDbBlockReference *pBlockRef=AcDbBlockReference::cast(pEnt);
        szFactor=GetAttValue(pBlockRef,"FAKTOR");
        szArt=GetAttValue(pBlockRef,"ART");
        acutPrintf("info:%s %s[x%s]\n", pEnt->isA()->name(),szArt,szFactor);
        
        err=pBlockRef->close();
        err=pEnt->close();
      }    
    }
    acedSSFree(ss);
  }
  UNLOCK_DOC;
}
/////////////////////////// Получение значения атрибута блока /////////////////////////////////////////////
// Передаём AcDbEntity*, CString, получаем CString //////////////////////////////
CString GetAttValue(AcDbBlockReference *t_pRef, CString opt_tag)
{
    CString t_str;
    AcDbObjectIterator *pAttIterator;
    pAttIterator = t_pRef->attributeIterator();
    AcDbAttribute *pAttribute;
    for(pAttIterator->start();!pAttIterator->done();pAttIterator->step())
    {
        t_pRef->openAttribute(pAttribute,pAttIterator->objectId(),AcDb::kForRead);
        t_str.Format("%s - %s\n",pAttribute->textString(),pAttribute->tag());
        OutputDebugString(t_str);
        if(opt_tag==pAttribute->tag())
        {    
            t_str=pAttribute->textString();
            break;
        }
        else
            t_str="";
        pAttribute->close();
    }
    t_pRef->close();
    delete pAttIterator;
    return t_str;
}

Эти ф-ции исполняются нормально, но после их выполнения при перемещении за "ручку" одного из использованых в них объекта акад вываливается с [ITERNAL ERROR] eHadMultipleReades. Что я не закрываю?

Re: eHadMultipleReades [ITERNAL ERROR]

В функции Lx если выбран не AcDbBlockReference, то ты его не закрываешь. Зато дважды закрываешь если это AcDbBlockReference.

Re: eHadMultipleReades [ITERNAL ERROR]

> Александр Ривилис
Замечание верное, но это уже 3-й вариат.
Изначально было

//AcDbObjectPointer<AcDbEntity> pEnt(eid,AcDb::kForRead);

и объект закрывался в деструкторе, если я правильно понял описание AcDbObjectPointer.
Когда начал искать ошибку переделал через acdbOpenAcDbEntity чтоб посмотреть код возврата.
В общем: испавил - не помогает.

Re: eHadMultipleReades [ITERNAL ERROR]

> Alexey Suprun
Ищи дальше где открываешь примитивы, а потом не закрываешь. Учти, что сообщение eHadMultipleReades возникает, когда примитив уже открыт на чтение 256 раз и ни разу закрыт. Кстати, а где ты инициализируешь AcDbObjectId eid; ?

Re: eHadMultipleReades [ITERNAL ERROR]

Последний вопрос снимаю - проглядел acdbGetObjectId(...)

Re: eHadMultipleReades [ITERNAL ERROR]

Нашел. В GetAttValue,

if(opt_tag==pAttribute->tag())
{
...
  pAttribute - не закрывается.
}

А вобще, можно было бы прикрутить в AcDbEntity / Object что-то типа:

OutputDebugStr("%s opened",this->isA()->name()) при открытии и
OutputDebugStr("%s closed",this->isA()->name()) при закрытии. 

Расходы в Release не увеличатся, а удобней было бы.