Не могу создать com-объект AutoCAD

Автор Тема: Не могу создать com-объект AutoCAD  (Прочитано 6161 раз)

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

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 222
  • Карма: 3
Всем доброго времени суток.
У меня такая проблемка. Не создается com-объект AutoCAD.
Для подключения к AutoCAD использую следующий код:
Код - C# [Выбрать]
  1. dynamic acApp = null;   // ссылка на экземпляр Application приложения AutoCAD
  2. public void GetComApp()
  3. {
  4.          try
  5.         {            {
  6.                 // Получение ссылки на экземпляр Application уже запущенного приложения AutoCAD
  7.                 acApp = CallFunc(() => Marshal.GetActiveObject("AutoCAD.Application"));
  8.             }
  9.             catch
  10.             {
  11.                 try
  12.                 {
  13.                     // Создание нового экземпляра Application приложения AutoCAD
  14.                     Type comAppType = Type.GetTypeFromProgID("AutoCAD.Application");
  15.                     acApp = GetApp(() => Activator.CreateInstance(comAppType));                    
  16.                 }
  17.                 catch(System.Exception e)
  18.                 {
  19.                     MessageBox.Show("Cannot create Com object AutoCAD");
  20.                 }
  21.             }
  22.       }
  23. }
  24.  

Метод CallFunc описан в сообщении https://adn-cis.org/forum/index.php?topic=7364.0
Все это прекрасно работало. Пару дней назад обнаружил, что код перестал работать.
Подключение к запущенному автокаду не происходит.
Значение переменной comAppType в операторе Type comAppType = Type.GetTypeFromProgID("AutoCAD.Application"); равно null
На компе стоит AutoCAD 2020.1
Спасибо.

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

  • Administrator
  • *****
  • Сообщений: 13069
  • Карма: 1685
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не могу создать com-объект AutoCAD
« Ответ #1 : 22-08-2021, 22:55:42 »
Борис_С,
Могу лишь посочувствовать. В первую очередь смотрите какие обновления Windows/AutoCAD были установлены с момента, когда это работало.
Возможно придётся переустанавливать AutoCAD. Это если не меняли разрядность вашего приложения. Разрядность приложения должна совпадать с разрядностью AutoCAD. В противном случае точно будут проблемы. Заодно проверьте в реестре наличие HKEY_CLASSES_ROOT\AutoCAD.Application и на что он ссылается.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 222
  • Карма: 3
Re: Не могу создать com-объект AutoCAD
« Ответ #2 : 23-08-2021, 16:01:29 »
AutoCAD.Application имеет 2 подпапки:
CLSID - значение - {4AC6DFE1-607B-45B2-B289-D7FBCD44169C}
CurVer - значение - AutoCAD.Application.23

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

  • Administrator
  • *****
  • Сообщений: 13069
  • Карма: 1685
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не могу создать com-объект AutoCAD
« Ответ #3 : 23-08-2021, 18:02:22 »
AutoCAD.Application имеет 2 подпапки:
CLSID - значение - {4AC6DFE1-607B-45B2-B289-D7FBCD44169C}
CurVer - значение - AutoCAD.Application.23
Этого недостаточно. Нужно проверять всю цепочку.



И установи своему приложению Platform Target: x64



Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 222
  • Карма: 3
Re: Не могу создать com-объект AutoCAD
« Ответ #4 : 25-08-2021, 10:48:31 »
А зачем менять Any CPU на x64. У меня стоит 64 битный Windows. Any CPU и означает, что программа подхватит текущую версию системы и будет работать с 64 битной версией.

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

  • Administrator
  • *****
  • Сообщений: 13069
  • Карма: 1685
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не могу создать com-объект AutoCAD
« Ответ #5 : 25-08-2021, 10:54:27 »
А зачем менять Any CPU на x64. У меня стоит 64 битный Windows. Any CPU и означает, что программа подхватит текущую версию системы и будет работать с 64 битной версией.
Нет. Совершенно необязательно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 222
  • Карма: 3
Re: Не могу создать com-объект AutoCAD
« Ответ #6 : 25-08-2021, 11:00:38 »
Немного подправил реестр.
Программа стала создавать com-объект, но по-прежнему не видит уже запущенную программу и не подключается к ней.

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

  • Administrator
  • *****
  • Сообщений: 13069
  • Карма: 1685
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не могу создать com-объект AutoCAD
« Ответ #7 : 25-08-2021, 12:54:04 »
Немного подправил реестр.
В чем заключались правки?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 222
  • Карма: 3
Re: Не могу создать com-объект AutoCAD
« Ответ #8 : 25-08-2021, 13:31:12 »
не было HKEY_CLASSES_ROOT\AutoCAD.Application
было только HKEY_CLASSES_ROOT\AutoCAD.Application.23

Мой коллега создал HKEY_CLASSES_ROOT\AutoCAD.Application, настроив его на HKEY_CLASSES_ROOT\AutoCAD.Application.23

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

  • Administrator
  • *****
  • Сообщений: 13069
  • Карма: 1685
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не могу создать com-объект AutoCAD
« Ответ #9 : 25-08-2021, 13:36:48 »
не было HKEY_CLASSES_ROOT\AutoCAD.Application
Ну тогда наверняка нет еще кучи веток в реестре. Нужно или откатывать систему на дату, когда всё работало или переустанавливать AutoCAD. Другого способа нет. Найти все необходимые ветки реестра и создать их вручную нереально.
Подозреваю, что установлен какой-нибудь чистильщих типа reg organizer или ccleaner, которые чистят реестр от того, что ини считают неиспользуемым и ненужным. Результат обычно именно такой...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 222
  • Карма: 3
Re: Не могу создать com-объект AutoCAD
« Ответ #10 : 25-08-2021, 15:24:45 »
Спасибо, Саша. Будет окно, переставлю.

Оффлайн Борис_САвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 222
  • Карма: 3
Re: Не могу создать com-объект AutoCAD
« Ответ #11 : 27-08-2021, 10:43:00 »
Я не прав. Все работает. Подключаюсь и к работающему приложению. Здесь оказалась одна тонкость. Действительно нельзя подключиться к приложению сразу после старта, но, если загрузить в AutoCAD хотя бы один файл, подключаюсь на ура.

Оффлайн marsh_one

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Re: Не могу создать com-объект AutoCAD
« Ответ #12 : 23-09-2021, 14:28:28 »
Александр Ривилис,  Добрый день. Александр, подскажите каким образом можно установить Platform Target: x64?
У меня похожая проблема, выскакивала ошибка, я добавил в код
Код - C# [Выбрать]
  1.         const uint RPC_E_SERVERFAULT = 0x80010105;
  2.         const uint HRESULT = 0x800706BA;

Теперь при запуске просто висит и нчиего не происходит, типа бесконечного цикла.

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

  • Administrator
  • *****
  • Сообщений: 13069
  • Карма: 1685
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Не могу создать com-объект AutoCAD
« Ответ #13 : 23-09-2021, 14:35:52 »
Добрый день. Александр, подскажите каким образом можно установить Platform Target: x64?




я добавил в код
Код - C# [Выбрать]

            const uint RPC_E_SERVERFAULT = 0x80010105;
            const uint HRESULT = 0x800706BA;


Теперь при запуске просто висит и нчиего не происходит, типа бесконечного цикла.
Не понял взаимосвязь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн marsh_one

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Re: Не могу создать com-объект AutoCAD
« Ответ #14 : 23-09-2021, 15:08:25 »
Вот в этой теме.
https://adn-cis.org/forum/index.php?topic=7364.0

Код - C# [Выбрать]
  1.     public partial class Form1 : Form
  2.     {
  3.         const int sleep = 500;
  4.         const uint RPC_E_CALL_REJECTED = 0x80010001;
  5.         const uint RPC_E_RETRY = 0x80010109;
  6.         const uint RPC_E_SERVERCALL_RETRYLATER = 0x8001010A;
  7.         const uint RPC_S_SERVER_TOO_BUSY = 1723;
  8.         const uint RPC_E_SERVERFAULT = 0x80010105;
  9.         const uint HRESULT = 0x800706BA;
  10.        
  11.  
  12.         public Form1()
  13.         {
  14.             InitializeComponent();
  15.         }
  16.  
  17.         private static string FormatNumber(string text)
  18.         {
  19.             if (double.TryParse(text, out double number))
  20.             {
  21.                 return number.ToString("N", CultureInfo.CreateSpecificCulture("en-US"));
  22.                 // Console.WriteLine(number);
  23.             }
  24.             return text;
  25.         }
  26.  
  27.         static void WriteErrorMsg(Exception ex, ConsoleColor c)
  28.         {
  29.             ConsoleColor prew = ForegroundColor;
  30.             ForegroundColor = c;
  31.  
  32.             Error.WriteLine("\nException (HResult = {0}):\n{1}",ex.HResult, ex.Message);
  33.             ForegroundColor = prew;
  34.         }
  35.  
  36.         /// <summary>
  37.         /// Проверка доступности COM объекта Application,
  38.         /// представляющего экземпляр AutoCAD.
  39.         /// </summary>
  40.         /// <param name="app">COM объект Application.</param>
  41.         /// <returns>Возвращается true в случае готовности
  42.         /// объекта Application к работе. В противном случае
  43.         /// возвращается false.</returns>
  44.         ///
  45.         static bool CheckReady(object app)
  46.         {
  47.  
  48.             if (app == null)
  49.                 return false;
  50.  
  51.             dynamic acad = app;
  52.             bool isQuiescent = false;
  53.  
  54.             while (true)
  55.             {
  56.                 try
  57.                 {
  58.                     dynamic state = acad.GetAcadState();
  59.                     isQuiescent = state.IsQuiescent;
  60.                     break;
  61.                 }
  62.                 catch (COMException ex)
  63.                 {
  64.                     uint err = (uint)ex.ErrorCode;
  65.                     switch (err)
  66.                     {
  67.                         case RPC_E_CALL_REJECTED:
  68.                         case RPC_E_RETRY:
  69.                         case RPC_E_SERVERCALL_RETRYLATER:
  70.                         case RPC_S_SERVER_TOO_BUSY:
  71.                         case RPC_E_SERVERFAULT:
  72.                         case HRESULT:
  73.  
  74.                         {
  75.                                 WriteErrorMsg(ex, ConsoleColor.Yellow);
  76.                                 Thread.Sleep(sleep);
  77.                                 break;
  78.                             }
  79.                         default:
  80.                             {
  81.                                 WriteErrorMsg(ex, ConsoleColor.Red);
  82.                                 throw;
  83.                             }
  84.                     }
  85.                 }
  86.                 catch (Exception ex)
  87.                 {
  88.                     WriteErrorMsg(ex, ConsoleColor.Red);
  89.                     throw;
  90.                 }
  91.             }
  92.             return isQuiescent;
  93.         }
  94.  
  95.         /// <summary>
  96.         /// Получить COM объект Application.
  97.         /// </summary>
  98.         /// <param name="func">Лямбда-выражение, возвращающее
  99.         /// искомый COM объект Application.</param>
  100.         /// <returns>Возвращается COM объект Application.
  101.         /// </returns>
  102.         static object GetApp(Func<object> func)
  103.         {
  104.  
  105.             if (func == null)
  106.             {
  107.                 throw new ArgumentNullException(nameof(func));
  108.             }
  109.  
  110.             while (true)
  111.             {
  112.                 try
  113.                 {
  114.                     object obj = func();
  115.                     return obj;
  116.                 }
  117.                 catch (COMException ex)
  118.                 {
  119.                     uint err = (uint)ex.ErrorCode;
  120.                     switch (err)
  121.                     {
  122.                         case RPC_E_CALL_REJECTED:
  123.                         case RPC_E_RETRY:
  124.                         case RPC_E_SERVERCALL_RETRYLATER:
  125.                         case RPC_S_SERVER_TOO_BUSY:
  126.                         case RPC_E_SERVERFAULT:
  127.                         case HRESULT:
  128.                             {
  129.                                 WriteErrorMsg(ex, ConsoleColor.Yellow);
  130.                                 Thread.Sleep(sleep);
  131.                                 break;
  132.                             }
  133.                         default:
  134.                             {
  135.                                 WriteErrorMsg(ex, ConsoleColor.Red);
  136.                                 throw;
  137.                             }
  138.                     }
  139.                 }
  140.                 catch (Exception ex)
  141.                 {
  142.                     WriteErrorMsg(ex, ConsoleColor.Red);
  143.                     throw;
  144.                 }
  145.             }
  146.         }
  147.  
  148.  
  149.         //
  150.         /// <summary>
  151.         /// Метод предназначен для получения COM-объекта или
  152.         /// значения его свойств. Или же для вызова метода COM-
  153.         /// объекта, возвращающего некоторое значение.
  154.         /// </summary>
  155.         /// <param name="app">COM объект Application.</param>
  156.         /// <param name="func">Лямбда-выражение, подлежащее
  157.         /// выполнению.</param>
  158.         /// <returns>Возвращаемый тип Object вызывающая сторона
  159.         /// должна присваивать dynamic-переменной, дабы можно
  160.         /// было полноценно использовать свойства, методы и
  161.         /// события полученного объекта (без рефлексии).
  162.         /// </returns>
  163.         static object CallFunc(object app, Func<object> func)
  164.         {
  165.                 if (app == null)
  166.                 throw new ArgumentNullException(nameof(app));
  167.  
  168.             if (func == null)
  169.                 throw new ArgumentNullException(nameof(func));
  170.  
  171.             while (!CheckReady(app))
  172.             {
  173.                 // ждём, когда приложение будет готово...
  174.             }
  175.  
  176.             object obj = func();
  177.             return obj;
  178.         }
  179.  
  180.         /// <summary>
  181.         /// Метод предназначен для изменения свойств COM-объекта
  182.         /// , или же для вызова метода COM-объекта, ничего не
  183.         /// возвращающего в качестве результата.
  184.         /// </summary>
  185.         /// <param name="app">COM объект Application.</param>
  186.         /// <param name="func">Лямбда-выражение, подлежащее
  187.         /// выполнению.</param>
  188.         static void DoAction(object app, Action func)
  189.         {
  190.  
  191.             if (app == null)
  192.                 throw new ArgumentNullException(nameof(app));
  193.  
  194.             if (func == null)
  195.                 throw new ArgumentNullException(nameof(func));
  196.  
  197.             while (!CheckReady(app))
  198.             {
  199.                 // ждём, когда приложение будет готово...
  200.             }
  201.  
  202.             func();
  203.         }

Я по сути делаю, тоже , что и у автора этой темы. Но выскакивают ошибки.
Я их добавлял в исключения.

Код - C# [Выбрать]
  1.         const uint RPC_E_SERVERFAULT = 0x80010105;
  2.         const uint HRESULT = 0x800706BA;

Сейчас когда заупскаю приложение, просто висит и нчиего не происходит.

Как вызвать окно показанное Вами на скрине?