Тема: "Unhandled Access Violation" при попытке установки значения переменной Acad'a

Значит есть такой код:

void SetAcadVar()
{
   AcDbDatabase *MainDB;
   MainDB = acdbHostApplicationServices()->workingDatabase();
   MainDB->setDimzin(8);
}

Назначение указанной функции просто - перед началом работы программы установить значение переменной Acad'a DIMZIN равным 8.
Все казалось бы просто... ан нет! При работе в Acad2006 происходит FATAL ERROR с ошибкой (см. сабж).
Причем при вызове из пустого чертежа - все тип-топ, а загружаю насыщенный чертежик - и при определенных вызовах программы - хрясь... и ошибка.
Заглушаю фызов функции в программе - ничего не сбоит. Причем замечено, что при работе аналогичной программы в Acad'ах 2000-2002 указанной проблемы не наблюдалось...
Мистика какая-то...

Re: "Unhandled Access Violation" при попытке установки значения переменной Acad'a

Попробуй эти два варианта:

// Вариант 1
void SetVarDimZin1(int dimzin)
{
  resbuf var;
  var.rbnext = NULL; var.restype = RTSHORT; var.resval.rint = dimzin;
  acedSetVar("dimzin",&var);
}
// Вариант 2
void SetVarDimZin2(int dimzin)
{
  AcDbDatabase *MainDB;
  MainDB = acdbHostApplicationServices()->workingDatabase();
  if (MainDB) {
    AcAxDocLock lock(MainDB);
    MainDB->setDimzin(dimzin);
  }
}

Re: "Unhandled Access Violation" при попытке установки значения переменной Acad'a

Упс! Так лучше.

// Вариант 2
void SetVarDimZin2(int dimzin)
{
  AcDbDatabase *MainDB;
  MainDB = acdbHostApplicationServices()->workingDatabase();
  if (MainDB) {
    AcAxDocLock lock(MainDB);
    if (lock.lockStatus() == Acad::eOk) {
      MainDB->setDimzin(dimzin);
    }
  }
}

Re: "Unhandled Access Violation" при попытке установки значения переменной Acad'a

Попробовал. Результат тот-же самый. Причем lock.lockStatus() возвращает иемнно Acad::eOk! Стоит только взять в комменты MainDB->setDimzin(dimzin) все работает без проблем...
Что за Хрень?

Re: "Unhandled Access Violation" при попытке установки значения переменной Acad'a

1) SP1 стоит?
2) А с acedSetVar(...) тоже вылетает?

Re: "Unhandled Access Violation" при попытке установки значения переменной Acad'a

Вариант с "ресбуфами" работает стабильно. Но не хочется возвращаться к старому стилю программирования. К тому же  есть желание понять природу глюка...
Интересно, а может ли влиять тот факт что я использую OArx2004, а тестирую прогу в 2006? Может совместимость "снизу в верх" здесь не работает?

Re: "Unhandled Access Violation" при попытке установки значения переменной Acad'a

> Александр Ривилис
Product service pack: AutoCAD 2006 - English SP1

Re: "Unhandled Access Violation" при попытке установки значения переменной Acad'a

> Debalance
1) Нужно пользоваться тем, что работает стабильно.
2) Твой вариант имеет смысл только если тебе нужно изменять dimzin для чертежа, который не является текущим (а в твоем примере это не так).
3) В принципе это может быть и глюк AutoCAD 2006, но я не смог на него у себя попасть.
4) Совместимость "снизу вверх" в AutoCAD 2004->2005->2006 во всех случаях с которыми я сталкивался - работает. Конечно быть уверенным на 100% - невозможно. Чтобы не гадать - попробуй с ObjectARX 2006.

Re: "Unhandled Access Violation" при попытке установки значения переменной Acad'a

> Александр Ривилис
1) Не вызывает возражений.
2) Попробовал с OARX2006 - тот же эффект.
Особенности глюка таковы:
- насыщенный чертеж (порядка 40000 элементарных объектов);
- при вводе команды (с программой) в командной строке с нажатием "Enter" глюк может не проявляться некоторое время. Но если чуть позже снова ввести команду вручную и нажать праву кнопку мыши выбрав в контекстной менюшке Repeat "COMMANDNAME" - то крах...
При пустом чертеже глюк не наблюдался...

Re: "Unhandled Access Violation" при попытке установки значения переменной Acad'a

> Debalance
А твоя команда кроме того, что устанавливает DIMZIN в 8 еще что-то делает? Если да, то оставь в команде только изменение DIMZIN. Если будет вылетать - глюк AutoCAD, если нет - глюк твой.

Re: "Unhandled Access Violation" при попытке установки значения переменной Acad'a

> Александр Ривилис
Да, похоже все-таки глюк мой. В голом проекте указанный пример работает. Придется копать глубже...

Re: "Unhandled Access Violation" при попытке установки значения переменной Acad'a

Глюк найден. Это очередная колдобина со стороны MFC, возникающая при оперировании ресурсами. Кому интересно, могу поделиться...

Re: "Unhandled Access Violation" при попытке установки значения переменной Acad'a

> Debalance
:) Поделись.
P.S.: А с методами тестирования у тебя - "незачёт". :)

Re: "Unhandled Access Violation" при попытке установки значения переменной Acad'a

> Александр Ривилис
Ну если "сам Александр" ставит такую жесткую оценку, тут уж ничего не попишешь - как говорится "придете в следующий раз".:))).
Впрочем не надо меня судить строго вьдь я по образованию не программист, а просто в удовольствие занимаюсь тем что интересно и иногда даже получается.
Итак о глюке. В моей проге сеть импортруемая фукция выводящая диалоговое окно. В моей DLL в теле фукции в самомом начале классически располагался макрос AFX_MANAGE_STATE(AfxGetStaticModuleState()) отвечающий за корректное "понимание" ресурсов данной библиотеки. Сразу за ним начинается тело программы, а именно сохранение и переназначение необходимых переменных  среды (в том числе DIMZIN) и т.д.
Ну в общем проблема решилась просто - переместил указанный макрос из начала основной функции в тело функции отвечающей непосредственно за вывод диалогового окна...