Тема: pEnt.openStatus()) == Acad::eOk - Ложь

Здравствуйте! Помогите, пожалуйста.
Запаскую приложение, функция:

  
    struct resbuf *eb1;     
    ads_name en,ss;
    Acad::ErrorStatus es;
    
    eb1 = acutBuildList(RTDXF0, L"INSERT", 2, NameStamp, 410, curLayout, RTNONE);
    acedSSGet(_T("X"), NULL, NULL, eb1, ss);
    acedSSName(ss,NULL,en);
    
        AcDbObjectId objId;
        acdbGetObjectId(objId,en);
            AcDbObjectPointer<AcDbBlockReference> pEnt(objId,AcDb::kForRead);
    if ((es = pEnt.openStatus()) == Acad::eOk) 
        {
                //Тут идет перебор аттрибутов и т.д.
                }
    pEnt->close();
 

Весь этот код чуть измененный пример Александра Ривилиса (вот).
На !8! вызов функции условие if ((es = pEnt.openStatus()) == Acad::eOk) перестаёт выполнятся.

Re: pEnt.openStatus()) == Acad::eOk - Ложь

скажи как ты сам видишь работу этих строчек, что они должны делать?

   eb1 = acutBuildList(RTDXF0, L"INSERT", 2, NameStamp, 410, curLayout, RTNONE); 
   acedSSGet(_T("X"), NULL, NULL, eb1, ss); 
   acedSSName(ss,NULL,en);

Re: pEnt.openStatus()) == Acad::eOk - Ложь

acedSSGet выбирает примитивы согласно списку, который мы сформировали в acutBuildList. acedSSName вроде бы аналог lisp-функции ssname

возвращает внутрипрог-раммное имя примитива

при чем первого примитива в наборе.

Re: pEnt.openStatus()) == Acad::eOk - Ложь

Дело в том, что я передаю в функцию имя блока который ищу (как не сложно догадаться), т.к. блоков много (2) приходится вызывать функцию часто.

Re: pEnt.openStatus()) == Acad::eOk - Ложь

и вылетает скорей всего, если блока не существует?
проверка на то, есть ли вообще хоть один элемент в выборке. если есть, то перекачиваем его в en, если нет, то вываливаемся из функции

if (acedSSName(ss, 0L, en) != RTNORM) return;

(изменено: Sergei, 12 июля 2010г. 17:15:41)

Re: pEnt.openStatus()) == Acad::eOk - Ложь

Приложение запускается 8 раз подряд! Блок как был так и остался.
При чем отваливается частями=) Сначала не может считать часть атрибутов, а затем оставшиеся в блоке.

(изменено: Николай, 12 июля 2010г. 17:22:28)

Re: pEnt.openStatus()) == Acad::eOk - Ложь

тогда нада больше кода. по этому куску могу только сказать, что pEnt->close(); лучше внести перед }, т.к. закрывать объект смысла нет, если он не открывался. кстати, это тоже может привести к ошибке.
и еще делать дополнительную проверку на acedSSName как в посте №5.

PS: да, чуть не забыл, что возвращает es?

(изменено: Sergei, 12 июля 2010г. 21:10:16)

Re: pEnt.openStatus()) == Acad::eOk - Ложь

Николай, ты прав. Дело в блоке, проверка помогла это понять. [S]В начале блок находится в 0 слое, а потом сваливается в дефпойнтс.[/S] Запускаю приложение, делаю прогон 8 раз, приложение входит в ступор. Пытаюсь зайти в атрибуты блока ("Редактировать аттрибуты"), а он мне предлагает выбрать блок х_Х

es не изменяется, по крайней мере в дебаге (чем померить я не знаю=).

[S]ЗЫ Я наверное что-то плохое с блоком сделал=)[/S]
Со всей таблицей блоков =(

(изменено: Sergei, 12 июля 2010г. 21:17:48)

Re: pEnt.openStatus()) == Acad::eOk - Ложь

Разницы где писать

pEnt->close();

нету.

Re: pEnt.openStatus()) == Acad::eOk - Ложь

Не вижу в коде 

acedSSFree(ss);

(изменено: Sergei, 12 июля 2010г. 22:47:44)

Re: pEnt.openStatus()) == Acad::eOk - Ложь

Вот этого то мне и не хватало=) Большое спасибо Александр Наумович!