ARX приложение для Автокада 2016 x64 под Windows 8.1.

Автор Тема: ARX приложение для Автокада 2016 x64 под Windows 8.1.  (Прочитано 22996 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн BatonАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 3
Всем доброго времени суток!
У меня такой вопрос к сообществу. Мое АRX приложение нормально работает во всех Автокадах вплоть до 2016-го и под операционными системами вплоть до Windows 7 x64. Компилировалась под ObjectARX 2015. Никогда не было от пользователей никаких нареканий. На днях прислали рекламации, что есть проблемы. Среда мне пока неизвестная - Windows 8.1. Приложение нормально загружается, открывается главное диалоговое окно программы. Далее из этого окна должно открываться другое диалоговое окно. При попытке открыть его программа выдает ошибку из обработчика ошибок. Искал ошибку в коде и ничего пока не нашел. Может есть какие-нибудь нюансы при переходе на Windows 8? Может надо компилировать только под ObjectRX 2016? Windows 8 под рукой нет и не предвидится в ближайшее время, поэтому проверить сам не могу.
Заранее спасибо за ответ.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Windows 8 под рукой нет и не предвидится в ближайшее время, поэтому проверить сам не могу.
Значит нужно передать версию с отладочной печатью пользователю чтобы локализовать ошибку. Или ставить себе виртуальную машину и отлаживать. Но второй вариант может не помочь, т.к. это может быть особенность именно той конфгурации, которая сложилась у пользователя.
Далее из этого окна должно открываться другое диалоговое окно. При попытке открыть его программа выдает ошибку из обработчика ошибок.
Если диалог модальный, то отлаживать скорее всего нужно или его конструктор или его метод OnInitDialog.
Может надо компилировать только под ObjectRX 2016?
Встречный вопрос. А что в инициализации диалога используются какие-то функции ObjectARX? Если нет, то причем здесь версия ObjectARX?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Windows 8 под рукой нет и не предвидится в ближайшее время, поэтому проверить сам не могу.
Тогда это уподобляется лечению по фотографии... Если тестирование в Win8 даже не маячит на горизонте, то самый верный вариант (имхо): в системных требованиях указать, что для работы необходима Win7, не указывая Win8. Можно даже дополнительно акцентировать на этом внимание, мол именно Win7. А если всё же хочешь, чтобы работало и под Win8, то создавай создавай виртуальную машинку, ставь на ней интересующие тебя акады и тестируй, иначе возможно, что это не единственная проблема, которая неожиданно "всплывёт". IDE можно не ставить - удалённую отладку никто не отменял.

Оффлайн Николай Горлов

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
как вариант, на втором окне есть какой-то компонент, не совсем стандартный ))). ну и сам компонент про восьмерку ничего не знает, следовательно, валит программу. так что если я угадал, то, либо ищите более свежую версию библиотеки уже с поддержкой win8 и\или win10, которой пользуетесь, либо придется дорабатывать компонент самостоятельно. в любом случае, даже если это не компонент, без win8 на компьютере проблему не решить.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
без win8 на компьютере проблему не решить.
Если это действительно проблема совместимости с Win8, в чем я сильно сомневаюсь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Николай Горлов

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Цитировать
Если это действительно проблема совместимости с Win8, в чем я сильно сомневаюсь.
а что это еще может быть, если одна и та же ARX под таким же автокадом работает на win7 и НЕ работает под win8?
первое, чтоб приходит на ум - проблемы с содержимым окна. просто у меня была подобная ерунда, правда winXP->win7. Не работал один из достаточно стареньких и редко используемых EXE-ников. сам экзешник был написан при участии библиотеки WTL. библиотека просто была достаточно старенькая и ничего не знала о новых версиях виндузов. скачали свежачок ))). всё вроде как запустилось, но в самой библиотеке чего-то сильно намудрили и пришлось тягать кучу дополнительных dll-ок в придачу к экзешничку. начались конфликты с winXP... ))). ну и чтоб не делать отдельный вариант установки под win7/8, отказались от этой ерунды и пришлось мне переписать всё на MFC.
я конечно не исключаю того, что в момент запуска окна идет коннект на БД с вычитыванием огромного количества данных, которую забыли на этом компьютере поставить или сразу рисуется трехэтажный особняк с детальным освещением ))) или еще что-то из разряда фантастики (обычно на OnInitDialog сразу логику не цепляют, но мало ли ))) ).
а, ну и вторая мысля, которая случайно попала в голову ))) - переключение ресурсов. бывает так, что на одном компе всё ок, а второй напрочь отказывается показывать окно (правда в этом случае всегда выпадает сообщение об ошибке в ресурсах. по крайней мере на моих компьютерах). но это от windows вообще не зависит, а тут проблемы только с win8.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
а что это еще может быть, если одна и та же ARX под таким же автокадом работает на win7 и НЕ работает под win8?
Вариантов море. Но как правильно сказал Андрей Бушман, это всё гадание на кофейной гуще. Сначала нужно локализовать ошибку в коде, а потом уже разбираться проблема ли это с самим кодом или с Windows8.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн BatonАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 3
Большое спасибо за советы и комментарии всем отозвавшимся!
Если диалог модальный, то отлаживать скорее всего нужно или его конструктор или его метод OnInitDialog.
А что в инициализации диалога используются какие-то функции ObjectARX? Если нет, то причем здесь версия ObjectARX?
Диалог модальный. Конструктор диалога вообще не содержит функций.
В OnInitDialog мне нужно заполнить список. Данные получаю из своего NamedObjectsDictionary:
errorStatus = acdbHostApplicationServices()->workingDatabase()->getNamedObjectsDictionary(pNamedobj, AcDb::kForRead);
Далее
AcDbDictionary*   pRoomDict = NULL;
errorStatus = pNamedobj->getAt(ROOM_DICTIONARY_VER_3, (AcDbObject*&)pRoomDict, AcDb::kForRead);

Все errorStatus проверяю. Далее через итератор прохожу по моему NamedObjectsDictionary, получаю необходимые значения и заполняю список. Все открытые объекты вовремя закрываю. За этим всегда смотрю внимательно. Итератор в конце работы удаляю.
Ошибок в NamedObjectsDictionary нет, так как в главном диалоге тоже заполняется другой список из того же словаря. И делается это успешно.
Так же мне необходимо для работы диалога получить информацию из базы данных чертежа:
AcDbDatabase* pDatabase = acdbHostApplicationServices()->workingDatabase();
Потом прохожу по базе чертежа и получаю информацию из нужных мне объектов. Здесь, конечно, надо еще раз пройти по всем функциям и проверить на открыл-закрыл объекты. Хотя, если бы были такие ошибки, то вылетало бы при всех версиях. Это я знаю хорошо :)).

как вариант, на втором окне есть какой-то компонент, не совсем стандартный )))
Нестандартные компоненты в диалогах не применяю. Делаю это сознательно именно для полной совместимости со всеми версиями операционок и Автокадов.

ну и вторая мысля, которая случайно попала в голову ))) - переключение ресурсов.
Перед открытием диалога применяю CAcModuleResourceOverride.

Тогда это уподобляется лечению по фотографии...
Ну, есть такие люди, которые лечат по фотографии :)).
Я обратился за помощью, потому что может кто уже сталкивался с проблемами.

А если всё же хочешь, чтобы работало и под Win8, то создавай создавай виртуальную машинку, ставь на ней интересующие тебя акады и тестируй, иначе возможно, что это не единственная проблема, которая неожиданно "всплывёт". IDE можно не ставить - удалённую отладку никто не отменял.
К сожалению, я не такой продвинутый в этих делах :(. Так что пока попробую по простому, по крестьянски - найду комп с windows 8.

Что в итоге. Сейчас уже скачал ObjectARX 2016. Попробую перекомпилировать и послать программу человеку, у которого программа вылетает. Так же распечатаю код и проверю с карандашом в руках еще раз (наверное в десятый) построчно. Были у меня чудеса, когда ошибки в программах находились случайно лет через 5 после успешной эксплуатации программ. Но ошибки эти были все же не в таких явных местах, как инициализация диалогов. На работе нашел людей с Windows 8. Так что есть перспективы проверить. Еще раз спасибо за отзывы. По итогам борьбы отпишусь.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
К сожалению, я не такой продвинутый в этих делах :(. Так что пока попробую по простому, по крестьянски - найду комп с windows 8.
Дело твоё. Если вдруг возникнет желание почитать по теме, то здесь я показывал как это делается (всё достаточно просто).

Оффлайн BatonАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 3
Если вдруг возникнет желание почитать по теме, то здесь я показывал как это делается (всё достаточно просто).
Спасибо за наводку. По правде говоря, давно хотел разобраться с этой темой, но руки не доходили. Ну вот жизнь потихоньку и заставляет.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Перед открытием диалога применяю CAcModuleResourceOverride.
Перед открытием какого из диалогов? Я правильно понял, что второй диалог открывается тогда, когда первый диалог не закрыт?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн BatonАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 3
Я правильно понял, что второй диалог открывается тогда, когда первый диалог не закрыт?
Главный диалог убирается с экрана через BeginEditorCommand(), потому что при определенных событиях может произойти возврат из дочернего диалога обратно. Потом открывается дочерний диалог. Я всегда сомневался, надо ли при дочернем диалоге применять опять CAcModuleResourceOverride. На всякий случай ставлю, и вроде все работает нормально. Буду Вам признателен, если Вы мне проясните мозги по этому поводу. В документации по ARX ясно про это ничего не написано. Там только в общих чертах. Правда, может, я что и упустил.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Главный диалог убирается с экрана через BeginEditorCommand(), потому что при определенных событиях может произойти возврат из дочернего диалога обратно.
Ничего не понял. Этот метод нужен только если идёт обращение к редактору AutoCAD (т.е. например вызывается acedGetPoint(), acedGetAngle() и аналогичные им функции). Если из одного диалога вызывается другой диалог, то этот метод не нужен и более того вреден, т.к. переключает ресурсы на AutoCAD. 
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн BatonАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 66
  • Карма: 3
Ничего не понял. Этот метод нужен только если идёт обращение к редактору AutoCAD (т.е. например вызывается acedGetPoint(), acedGetAngle() и аналогичные им функции). Если из одного диалога вызывается другой диалог, то этот метод не нужен и более того вреден, т.к. переключает ресурсы на AutoCAD.
Я применяю этот метод всегда перед открытием диалогов. Почти во всех моих диалогах может быть обращение к чертежу для получения некоторой информации из выделенных объектов, или если надо получить какой-нибудь размер на чертеже для ввода его в диалог через указание каких-нибудь точек на чертеже. Естественно через все acedGet...()  и через acedEntSel(). Поэтому применяю CAcModuleResourceOverride в самом начале диалога один раз. Если я не прав, то скажите, что я неверно делаю. Мои программы с таким подходом работают давно и у меня в конторе и так же в других организациях. Ни от кого рекламаций не получал. Еще раз говорю, что в документации по ARX об этом подробно не написано. К тому же все на басурманском языке. Мог что-то не так понять. Прошу помочь в этом вопросе.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я никогда не обращался к редактору AutoCAD из вложенных диалогов. Считаю такой метод неправильным. IMHO.
Разобраться, что будет с переключением ресурсов в таком случае крайне сложно. В такой ситуации перед обращением к AutoCAD я бы принудительно переключал ресурсы на него и затем возвращал обратно: http://adn-cis.org/mfc-problemyi-s-cacmoduleresourceoverride.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение