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

ADN Club => AutoCAD .NET API => Тема начата: Андрей Бушман от 24-10-2016, 15:08:20

Название: Почему флагу LoadCtrls в качестве значения назначено 77?
Отправлено: Андрей Бушман от 24-10-2016, 15:08:20
Здесь (http://help.autodesk.com/view/ACD/2016/ENU/?guid=GUID-70D60274-57E0-4B22-8D0C-3C7F212A7CAF) перечислены допустимые значения флага LoadCtrls. Если задействовать сразу все флаги, то получится 63. Во вложении скрин, на котором для одного из "родных" имеющихся расширений от Autodesk этому флагу назначено значение 77. Если из 77 вычесть 63, то получаем 14, что соответствует набору флагов 8, 4 и 2.

Это очередной пример через задницу написанного кода, или же есть какая-то объективная причина использования 77 в качестве значения?
Название: Re: Почему флагу LoadCtrls в качестве значения назначено 77?
Отправлено: Александр Ривилис от 24-10-2016, 15:20:21
77 = 0x4D = 0x40 + 0x0D = 0x40 + 0x08 + 0x04+ 0x01 = kOnIdleLoad + kOnLoadRequest + kOnCommandInvocation + kOnProxyDetection
Код - C++ [Выбрать]
  1.   enum LoadReasons {
  2.     kOnProxyDetection = 0x01,
  3.     kOnAutoCADStartup = 0x02,
  4.     kOnCommandInvocation = 0x04,
  5.     kOnLoadRequest = 0x08,
  6.     kLoadDisabled = 0x10,
  7.     kTransparentlyLoadable = 0x20,
  8.     kOnIdleLoad = 0x40
  9.   };

Цитировать
kOnProxyDetection = 0x01  Load the ObjectARX application when objects of custom classes it controls are loaded via drawing open, dxfin, insert, and so on 
kOnAutoCADStartup = 0x02  Load the ObjectARX application when AutoCAD starts up 
kOnCommandInvocation = 0x04  Load the ObjectARX application whenever an unknown command is executed for which it has a registry entry 
kOnLoadRequest = 0x08  Allow loading of the ObjectARX application via the AcRxDynamicLinker::loadApp method 
kLoadDisabled = 0x10  Do not demand load the ObjectARX application for any reason 
kTransparentlyLoadable = 0x20  Load the ObjectARX application transparently 
kOnIdleLoad = 0x40  Load the ObjectARX application when the system is idle 



 
Название: Re: Почему флагу LoadCtrls в качестве значения назначено 77?
Отправлено: Андрей Бушман от 24-10-2016, 15:27:23
kOnIdleLoad = 0x40  Load the ObjectARX application when the system is idle 
Спасибо, понял: по обозначенной мною выше ссылке в документации отсуствует информация по ключу 0x40, что в десятичной системе соответствует 64.
Название: Re: Почему флагу LoadCtrls в качестве значения назначено 77?
Отправлено: Андрей Бушман от 24-10-2016, 15:33:49
А как тогда интерпретировать значение 0 (см. вложенный скрин)? Пока я его в своём коде интерпретирую как неизвестное значение.

На данный момент, насколько я вижу, все имеющиеся случаи для AutoCAD 2009-2017 учитываются таким набором флагов:

Код - C# [Выбрать]
  1. [Flags]
  2. public enum LoadCtrls {
  3.     Unknown = 0, // unknown value.
  4.     // Load application upon detection of proxy object
  5.     LoadWhenProxyDetected = 1,
  6.     // Load the application at startup
  7.     LoadAtApplicationStartup = 2,
  8.     // Load the application at start of a command
  9.     LoadWhenCommandLaunched = 4,
  10.     /* Load the application at the request of a user or
  11.      * another application. */
  12.     LoadWhenRequestedByUserOrApplication = 8,
  13.     // Do not load the application
  14.     DontLoad = 16,
  15.     // Load the application transparently
  16.     LoadTransparently = 32,
  17.     /* Load the ObjectARX application when the system is
  18.      * idle */
  19.     LoadArxWhenSystemIsIdle = 64
  20. }
Но мне бы хотелось вместо "Unknown "  написать что-то более понятное :).

И ещё один вопрос: значение 64 актуально только для ObjectARX application, или всё же может использоваться и для .Net-расширений?
Название: Re: Почему флагу LoadCtrls в качестве значения назначено 77?
Отправлено: Александр Ривилис от 24-10-2016, 16:29:10
Но мне бы хотелось вместо "Unknown "  написать что-то более понятное :).
Я так понимаю, что отличие 0 и 16 в том, что при 16 приложение не грузится даже если его пытаться грузить через API, а при 0 его можно принудительно загрузить.
64 относится и к Managed.
Название: Re: Почему флагу LoadCtrls в качестве значения назначено 77?
Отправлено: Андрей Бушман от 24-10-2016, 16:37:37
Спасибо!
Название: Re: Почему флагу LoadCtrls в качестве значения назначено 77?
Отправлено: Андрей Бушман от 25-10-2016, 13:35:44
Я так понимаю, что отличие 0 и 16 в том, что при 16 приложение не грузится даже если его пытаться грузить через API, а при 0 его можно принудительно загрузить.
Поторопился я с плюсиком к вашему сообщению...

Похоже, что ваше понимание оказалось ошибочным. Я проверял так: пытался через NETLOAD подгрузить управляемый плагин, для которого в реестре указано как 0, так и 16. Все попытки оказались успешными. Проверял в AutoCAD 2009 и 2017.

Можете в ADN уточнить в чём разница между этими значениями?
Название: Re: Почему флагу LoadCtrls в качестве значения назначено 77?
Отправлено: Александр Ривилис от 25-10-2016, 13:40:54
Можете в ADN уточнить в чём разница между этими значениями?
Ты видимо не понял о чем идёт речь. Загрузка по прямому пути к файлу (как это делает NETLOAD) работает в любом случае. В этом случае реестр просто не проверяется. Проверка производится при выполнении загрузки через имя приложения, т.е. через функцию acrxLoadApp, которой передаётся не путь к приложению, а имя приложения.
Название: Re: Почему флагу LoadCtrls в качестве значения назначено 77?
Отправлено: Андрей Бушман от 25-10-2016, 13:43:09
Проверка производится при выполнении загрузки через имя приложения, т.е. через функцию acrxLoadApp, которой передаётся не путь к приложению, а имя приложения.
Вы проверяли это?
Название: Re: Почему флагу LoadCtrls в качестве значения назначено 77?
Отправлено: Александр Ривилис от 25-10-2016, 13:51:07
Вы проверяли это?
Я не проверял, но об этом четко сказано в документации.
Можешь сам проверить. Кстати, вот "обертки":
AcDbHostApplicationServices::loadApp  -> HostApplicationServices.LoadApplication
acrxLoadApp -> DynamicLinker.LoadApp

Название: Re: Почему флагу LoadCtrls в качестве значения назначено 77?
Отправлено: Андрей Бушман от 25-10-2016, 13:53:43
Я не проверял, но об этом четко сказано в документации.
Можешь сам проверить. Кстати, вот "обертки":
AcDbHostApplicationServices::loadApp  -> HostApplicationServices.LoadApplication
acrxLoadApp -> DynamicLinker.LoadApp
Спасибо!
Название: Re: Почему флагу LoadCtrls в качестве значения назначено 77?
Отправлено: Андрей Бушман от 25-10-2016, 14:23:34
Подправил перечисление:
Код - C# [Выбрать]
  1. [Flags]
  2. public enum LoadCtrls {
  3.     /// <summary>
  4.     /// Don't load application. This variant allows to load
  5.     /// the application later through the
  6.     /// `HostApplicationServices.LoadApplication` or
  7.     /// `DynamicLinker.LoadApp` functions.
  8.     /// </summary>
  9.     NotLoad = 0,
  10.     /// <summary>
  11.     /// Load application upon detection of proxy object.
  12.     /// </summary>
  13.     LoadWhenProxyDetected = 1,
  14.     /// <summary>
  15.     /// Load the application at startup.
  16.     /// </summary>
  17.     LoadAtApplicationStartup = 2,
  18.     /// <summary>
  19.     /// Load the application at start of a command.
  20.     /// </summary>
  21.     LoadWhenCommandLaunched = 4,
  22.     /// <summary>
  23.     /// Load the application at the request of a user or
  24.     /// another application.
  25.     /// </summary>
  26.     LoadWhenRequestedByUserOrApplication = 8,
  27.     /// <summary>
  28.     /// Do not load the application. Also this variant
  29.     /// forbids to load the application later through the
  30.     /// `HostApplicationServices.LoadApplication` or
  31.     /// `DynamicLinker.LoadApp` functions.
  32.     /// </summary>
  33.     ForbidLoad = 16,
  34.     /// <summary>
  35.     /// Load the application transparently.
  36.     /// </summary>
  37.     LoadTransparently = 32,
  38.     /// <summary>
  39.     /// Load the application when the system is idle.
  40.     /// </summary>
  41.     LoadArxWhenSystemIsIdle = 64
  42. }