Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Андрей Бушман от 19-04-2016, 13:26:58

Название: ShowModelessWindow криво работает в accoreconsole.exe
Отправлено: Андрей Бушман от 19-04-2016, 13:26:58
AutoCAD 2016 x64

Полагаю, что это очередной баг accoreconsole.exe.

В составе абстрактного класса Autodesk.AutoCAD.ApplicationServices.Core.Application определены методы ShowModelessWindow и ShowModalWindow. Соответственно эти методы доступны для работы и в accoreconsole.exe.

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

Код - C# [Выбрать]
  1. public class ExtensionApplication : IExtensionApplication {
  2.  
  3.     static Window win = null;
  4.  
  5.     static ExtensionApplication() {
  6.         win = new Window();
  7.     }
  8.  
  9.     public void Initialize() {
  10.         if (null != win) cad.ShowModelessWindow(win);
  11.         // if (null != win) cad.ShowModalWindow(win);
  12.     }
  13.  
  14.     public void Terminate() {
  15.         // Nothing is here.
  16.     }
  17. }
Название: Re: ShowModelessWindow криво работает в accoreconsole.exe
Отправлено: Александр Ривилис от 19-04-2016, 13:28:47
Вероятно именно так и задумано - приложение консольное.
Название: Re: ShowModelessWindow криво работает в accoreconsole.exe
Отправлено: Андрей Бушман от 19-04-2016, 14:05:16
Вероятно именно так и задумано - приложение консольное.
Когда карта противоречит местности, доверять следует местности. Обратите внимание на то, что это класс Autodesk.AutoCAD.ApplicationServices.Core.Application, вынесенный в accoremgd.dll ещё в AutoCAD 20012. Это, как вы выразились "так и задумано" скорее всего обусловлено тем, что поведение обозначенного метода в accoreconsole.exe попросту не тестировалось (как и многое другое в обозначенном приложении).

Я понимаю, что вы "рыцарь ObjectARX", но тем не менее существуют разумные границы безразборчивой "защиты" всего, что относится к работодателю... Если функционал заявлен в API, следовательно он должен работать во всех возможных контекстах его использования. Ведь обозначенные выше методы определены не в составе acmgd.dll...

Через обозначенные выше методы я пробовал хостить WCF службу в составе экземпляра Window, ожидая, что может быть в этом случае служба всё же будет получать сообщения от клиентов. Ожидания не оправдались. Попутно выяснился обозначенный выше баг (или "так и задумано", как вы выразились). Между "задумано" и "реализовано" есть существенная разница...
Название: Re: ShowModelessWindow криво работает в accoreconsole.exe
Отправлено: Александр Ривилис от 19-04-2016, 14:08:09
Выложи пожалуйста полный тестовый проект - я отправлю в ADN DevHelp.
Название: Re: ShowModelessWindow криво работает в accoreconsole.exe
Отправлено: Андрей Бушман от 19-04-2016, 14:16:48
Выложи пожалуйста полный тестовый проект - я отправлю в ADN DevHelp.
Так а чем вас не устроил тот код, который я выложил в первом сообщении? Он прост и нагляден. Его легко скопировать и вставить в новый проект - этого будет достаточно, чтобы воспроизвести проблему. Обозначенный код скопирован из рабочего проекта, который не является тестовым, в виду чего не подлежит отправке на сторону. Я наблюдаю идентичное поведение как для экземпляров класса Window, так и для экземпляров пользовательских классов унаследованных от него.
Название: Re: ShowModelessWindow криво работает в accoreconsole.exe
Отправлено: Александр Ривилис от 19-04-2016, 14:23:43
Так а чем вас не устроил тот код, который я выложил в первом сообщении?
Тем, что нужен как минимум еще класс MyWindow. Ты хочешь прояснить для себя вопрос с возможностью вызова из AcCoreConsole? Если да, то сделай то, что я попросил. Видео для них я запишу сам.
Название: Re: ShowModelessWindow криво работает в accoreconsole.exe
Отправлено: Андрей Бушман от 19-04-2016, 14:28:50
Тем, что нужен как минимум еще класс MyWindow.
Window, а не MyWindow. Я подправил код до того, как вы написали последнее сообщение. Так что MyWindow не нужен для воспроизведения бага.
Название: Re: ShowModelessWindow криво работает в accoreconsole.exe
Отправлено: Андрей Бушман от 19-04-2016, 14:39:02
В консольном акаде 2013 поведение аналогичное.
Название: Re: ShowModelessWindow криво работает в accoreconsole.exe
Отправлено: Андрей Бушман от 19-04-2016, 14:40:27
Кстати, а вот сервис в консольном акаде 2013 отработал на "ура" (если не считать того, что отправляемый на консоль текст по факту там не появляется)... Ну это я так, для самого себя пометку дал.
Название: Re: ShowModelessWindow криво работает в accoreconsole.exe
Отправлено: Александр Ривилис от 19-04-2016, 16:10:48
У консоли другая логика работы. Модальный WPF работает нормально, а вот немодальный показывает окно, но не обрабатывает его сообщения и продолжает свою работу вплоть до завершения. В обычном консольном приложении всё также.
Название: Re: ShowModelessWindow криво работает в accoreconsole.exe
Отправлено: Андрей Бушман от 19-04-2016, 16:12:49
Тогда непонятно, почему этот метод вынесен в accoremgd.dll...
Название: Re: ShowModelessWindow криво работает в accoreconsole.exe
Отправлено: Александр Ривилис от 19-04-2016, 16:45:47
Мне вот более интересно почему Application.ShowAlertDialog не показывает диалоговое окно, а печатает в командную строку... ;)
Название: Re: ShowModelessWindow криво работает в accoreconsole.exe
Отправлено: Андрей Бушман от 19-04-2016, 16:49:17
Мне вот более интересно почему Application.ShowAlertDialog не показывает диалоговое окно, а печатает в командную строку... ;)
а если перед этим FILEDIA временно установить в 1?

Мне вот более интересно почему...
Мне более интересно, чего такого нахимичили в 2016-м, что стало невозможно достучаться до хостящихся в нём WCF сервисов. В этом свете поведение Application.ShowAlertDialog меня интересует в значительно меньшей мере...
Название: Re: ShowModelessWindow криво работает в accoreconsole.exe
Отправлено: Александр Ривилис от 19-04-2016, 16:57:10
а если перед этим FILEDIA временно установить в 1?
А в этом случае даже NETLOAD не работает. Команда просто проглатывается:

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F120455%2F7842324.6%2F0_121b51_9a8ee476_orig.png&hash=76fdec1f846a455edad44c722c47499b)

Название: Re: ShowModelessWindow криво работает в accoreconsole.exe
Отправлено: Андрей Бушман от 19-04-2016, 17:04:11
А в этом случае даже NETLOAD не работает.
а если после NETLOAD, программно в коде перед вызовом алерта с последующим возвратом значения после вызова?