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

ADN Club => ObjectARX => Тема начата: drunkwolfs от 17-09-2016, 21:40:26

Название: Определить что автокад запустился и готов к работе
Отправлено: drunkwolfs от 17-09-2016, 21:40:26
У внешней программы запускающей автокад есть необходимость определять что автокад запустился и готов к работе.
Программу пишу на плюсах.
версии автокадов с 2010 по 2017, поэтому пытаюсь найти какой то универсальный способ для всех этих версий.
Смотрел вывод командной строки процесса acad.exe, ничего полезного не нашел.
У кого есть какие идеи?
Название: Re: Определить что автокад запустился и готов к работе
Отправлено: Александр Ривилис от 17-09-2016, 22:33:48
У внешней программы запускающей автокад есть необходимость определять что автокад запустился и готов к работе.
Как она запускает AutoCAD?
Эту статью читал: http://adn-cis.org/kak-ispolzuya-visual-c-zapustit-autocad-i-zastavit-ego-vyipolnyat-nekotoryie-dejstviya.html ?
Название: Re: Определить что автокад запустился и готов к работе
Отправлено: drunkwolfs от 17-09-2016, 22:42:11
Как она запускает AutoCAD?
CreateProcess(str1, str2, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
Извините, вам запрещён просмотр содержимого спойлеров.
Название: Re: Определить что автокад запустился и готов к работе
Отправлено: Александр Ривилис от 17-09-2016, 22:47:57
drunkwolfs,
1. Прочитай у меня в подписи как следует форматировать код на форуме.
2. Так запуская AutoCAD ты не сможешь определить когда он готов к работе.
Название: Re: Определить что автокад запустился и готов к работе
Отправлено: drunkwolfs от 18-09-2016, 00:11:44
А как тогда нужно запускать автокад?
Я с киберфорума и привык что там для форматирования кода каждого из языков есть отдельная кнопка. Это очень удобно. Удобнее чем выбирать в списке.
Название: Re: Определить что автокад запустился и готов к работе
Отправлено: Александр Ривилис от 18-09-2016, 00:23:08
Я с киберфорума и привык что там для форматирования кода каждого из языков есть отдельная кнопка. Это очень удобно. Удобнее чем выбирать в списке.
А здесь иначе. Извольте соблюдать Правила форума. Кстати, я уже не первый раз об этом Вас прошу.
А как тогда нужно запускать автокад?
Статью, ссылку на которую я давал выше, читали?
Если запускать AutoCAD через CreateProcess, то обращаться потом к нему очень сложно. Разве что грузить arx-файл или запускать скрипт (смотри ключи запуска acad.exe). Скрипт автоматически запускается после того, как AutoCAD готов принимать команды.
Название: Re: Определить что автокад запустился и готов к работе
Отправлено: drunkwolfs от 19-09-2016, 19:40:58
Как выбрать какой автокад запустить на этапе исполнения? у меня всегда 2014 запускается, хотя я указал tlb от 2010-го.
Мне нужен один исполняемый файл для запуска любой версии автокад.
Еще не понятно где указывать разрядность того автокада который необходимо запустить
Название: Re: Определить что автокад запустился и готов к работе
Отправлено: Алексей Кулик от 19-09-2016, 21:02:37
В таком режиме, боюсь, придется читать реестр, определять путь к acad.exe для нужной версии - и запускать именно его.
Название: Re: Определить что автокад запустился и готов к работе
Отправлено: Александр Ривилис от 19-09-2016, 22:44:38
Как выбрать какой автокад запустить на этапе исполнения? у меня всегда 2014 запускается, хотя я указал tlb от 2010-го.
А кто тебе сказал, что tlb хоть как-то определяет какая версия AutoCAD будет запущена? Даже то, что указано в моей статье по ссылке выше не гарантирует запуск указанной версии AutoCAD. Чтобы запускалась нужная версия через COM/ActiveX нужно править налету реестр, причем раздел, который недоступен обычным пользователям: HKEY_CLASSES_ROOT\AutoCAD.Application и/или HKEY_CLASSES_ROOT\AutoCAD.Application.XX.Y
Поэтому если необходим запуск и работа с конкретной версией AutoCAD, то необходимо:
1. Завершить все процессы acad.exe - как это делать решать тебе.
2. При помощи CreateProcess запускаешь нужный acad.exe
3. Немного подождать и через COM/ActiveX подключиться к запущенному acad.exe:
Код - C++ [Выбрать]
  1. CLSID clsid ;
  2. HRESULT hr = S_OK;
  3. _com_util::CheckError(CLSIDFromProgID (L"AutoCAD.Application", &clsid));
  4. IAcadApplicationPtr pApp;
  5. // Я тут написал цикл, который может оказаться
  6. // бесконечным если не удается подключится к AutoCAD
  7. // так что продумай вариант выхода из этого цикла
  8. while (FAILED(pApp.GetActiveObject(clsid)))
  9. {
  10.    Sleep(1000);
  11. }
  12. // Теперь мы готовы работать с AutoCAD через COM/ActiveX
Название: Re: Определить что автокад запустился и готов к работе
Отправлено: Александр Ривилис от 19-09-2016, 22:46:41
Еще не понятно где указывать разрядность того автокада который необходимо запустить
В пределах от 2010 и до последнего на текущий момент 2017 разрядность системы определяет разрядность AutoCAD, так что тебе не нужно с этим заморачиваться.