A.Kudrjashov Posted March 25, 2021 Report Share Posted March 25, 2021 Предыстория. На сегодняшний день имеем уже 3 версии платформы nanoCAD: - nanoCAD 20.0, (некоторые приложения запускаются только на NC20.0) - nanoCAD 20.1, - nanoCAD 21.0 Было бы логично, если бы при обращении к ним из внешних скриптов, обращение "по умолчанию" происходило к необходимой пользователю версии. Ранее, предлагались рекомендации для фиксации "приложения по умолчанию" запускать требуемый Ncad.exe с ключом /register.https://forum.nanocad.ru/index.php?/topic/3182-pervye-shagi-v-mir-programmirovaniya-pod-nanocad/&do=findComment&comment=61220 И это срабатывает для запуска "приложения по умолчанию" двойным щелчком мыши в проводнике. ... но не срабатывает при попытке обратиться к запущенному приложению из внешних скриптов. Так при выполнении команды в Powershell $nanoCAD = [Runtime.Interopservices.Marshal]::GetActiveObject('nanoCAD.Application') $nanoCAD Мы получаем Спойлер При запущенном только nanoCAD 20.1 и не запущенном nanoCAD 21.0 получаем ошибку. При попытке создать новый объект, запускается опять таки именно приложение nanoCAD 21.0. При этом в реестре видно, что "приложение по умолчанию" зарегистрировано как положено на nanoCAD 20.1 Спойлер Спойлер 1 Quote Link to comment Share on other sites More sharing options...
ISL Posted March 25, 2021 Report Share Posted March 25, 2021 Странно выглядит реестр. А где в нём nanoCADx64.Application.21.0? Что зарегистрировано на nanoCAD.Application, 20.x или 21.x, нужно смотреть в ключе nanoCAD.Application, а не в nanoCADx64.Application.20.0, откуда там взяться 21-й версии? Что касается подключения к бегущему nanoCAD-у, для различения версий, рекомендуем использовать полные названия вида nanoCADx64.Application.20.0 или nanoCADx64.Application.21.0. Quote Link to comment Share on other sites More sharing options...
A.Kudrjashov Posted March 25, 2021 Author Report Share Posted March 25, 2021 (edited) 51 минуту назад, ISL сказал: Странно выглядит реестр. А где в нём nanoCADx64.Application.21.0? Это ко мне вопрос ? Не знаю. NC 20.0 и 20.1 в реестре аналогично не различаются. 51 минуту назад, ISL сказал: Что зарегистрировано на nanoCAD.Application, 20.x или 21.x, нужно смотреть в ключе nanoCAD.Application, а не в nanoCADx64.Application.20.0, откуда там взяться 21-й версии? Во первых, NC21 - это, насколько я понимаю, 64 битная версия. Во вторых, разницы никакой Спойлер Edited March 25, 2021 by A.Kudrjashov Дополнения Quote Link to comment Share on other sites More sharing options...
ISL Posted March 25, 2021 Report Share Posted March 25, 2021 21-я и 20-я версия в реестре различаются, после ncad.exe /register ключ HKEY_CLASSES_ROOT\nanoCADx64.Application.21.0 появляется. Аналогично и после установки, инсталлятор тоже зовёт ncad.exe /register. Quote Link to comment Share on other sites More sharing options...
A.Kudrjashov Posted March 25, 2021 Author Report Share Posted March 25, 2021 (edited) 16 минут назад, ISL сказал: 21-я и 20-я версия в реестре различаются, после ncad.exe /register ключ HKEY_CLASSES_ROOT\nanoCADx64.Application.21.0 появляется. Аналогично и после установки, инсталлятор тоже зовёт ncad.exe /register. Так я же не против. HKEY_CLASSES_ROOT\nanoCADx64.Application.21.0 действительно появляется. А вот в HKEY_USERS его нет ... Спойлер P.S. Кстати, после того, как я перерегистрировал запуск на NC20.x обратно зарегистрировать "по умолчанию" через >Ncad.exe /register nanoCAD 21.0 на запуск по умолчанию уже не получается. Edited March 25, 2021 by A.Kudrjashov Дополнения 1 Quote Link to comment Share on other sites More sharing options...
doctorraz Posted March 25, 2021 Report Share Posted March 25, 2021 6 минут назад, A.Kudrjashov сказал: Ncad.exe /register nanoCAD 21.0 на запуск по умолчанию уже не получается аналогично доигрался я... register на нану 21 не срабатывает((( 1 Quote Link to comment Share on other sites More sharing options...
ISL Posted March 25, 2021 Report Share Posted March 25, 2021 > HKEY_CLASSES_ROOT\nanoCADx64.Application.21.0 действительно появляется. > А вот в HKEY_USERS его нет ... Значит, не под текущим пользователем смотрите. HKEY_CLASSES_ROOT — это же представление (view), которое собирается из ключа HKEY_LOCAL_MACHINE\SOFTWARE\Classes, на который сверху накладывается ключ HKEY_CURRENT_USER\SOFTWARE\Classes. Не обращали, кстати, внимание на такую "странность"? Чтобы удалить ключ в HKEY_CLASSES_ROOT, это надо сделать дважды, удалил-F5-появилось-удалил-F5-уже не появилось. Это так именно потому, что сперва удаляется из HKCU, по F5 отображается HKLM и следующее удаление (если прав хватит) удаляет уже там. Что касается перерегистрации на 21-ю версию, проблему подтвердить не удалось, у меня что зарегистрировано, то и стартует. Проверял следующим скриптом: var ncApp = getNCApp(); ncApp.Visible = true; var ThisDrawing = ncApp.ActiveDocument; function getNCApp() { var ncApp; var appCLS = "nanoCAD.Application"; try { ncApp = GetObject(appCLS) } catch (ex) { try { ncApp = new ActiveXObject(appCLS); } catch (ex) { WScript.StdErr.WriteLine("There is no ncApp") WScript.Quit(); } } return ncApp; } Quote Link to comment Share on other sites More sharing options...
doctorraz Posted March 25, 2021 Report Share Posted March 25, 2021 Только что, ISL сказал: Значит, не под текущим пользователем смотрите под текущим пользователем раздела nanoCAD.Application вообще не было сделал ручками, прописал ключи, COM интерфейс заработал Спойлер @ISL попробуй зарегистрировать (когда нет раздела) под бесправным пользователем. Пока под админом сидел,тож все регистрировалось. - а тут \HKEY_CLASSES_ROOT\nanoCAD.Application была регистрация на нану 20.1 руками HKEY_USERS\S-1-5-21-1702809543-4080770331-272954124-1001_Classes\nanoCAD.Application вбил, запустил нану21 и в HKEY_CLASSES_ROOT стала нана21 ---------- добавлено через 3 минут но руками в реестр любой сможет, меня больше интересует автоматическая или по register регистрация под обычным пользователем. Не работает ведь. Очевидно, что у нано21 с этим проблемы. 1 Quote Link to comment Share on other sites More sharing options...
A.Kudrjashov Posted March 25, 2021 Author Report Share Posted March 25, 2021 4 минуты назад, ISL сказал: начит, не под текущим пользователем смотрите. HKEY_CLASSES_ROOT — это же представление (view), которое собирается из ключа HKEY_LOCAL_MACHINE\SOFTWARE\Classes, на который сверху накладывается ключ HKEY_CURRENT_USER\SOFTWARE\Classes. Все смотрю под текущим пользователем. Специально администратора не запускаю, а все запускаю из под обычного пользователя. Photoshop и GIMP не использую. Что вижу, то и присылаю. При обращении от скрипта PowerShell сначала идёт опросHKEY_CLASSES_ROOT\nanoCAD.Application\CLSID\(default) а потом опрашивается соответствующий разделHKEY_CLASSES_ROOT\CLSID\{2047D158-CCAE-4F79-B460-2D735DF781B6}\ProgID Спойлер Quote Link to comment Share on other sites More sharing options...
ISL Posted March 25, 2021 Report Share Posted March 25, 2021 Действительно, под ограниченным пользователем регистрация не работает, а должна. Причём, эффект наблюдаю и в 21.0 и в 20.1. Будем разбираться. Quote Link to comment Share on other sites More sharing options...
doctorraz Posted March 25, 2021 Report Share Posted March 25, 2021 4 минуты назад, ISL сказал: Действительно, под ограниченным пользователем регистрация не работает, а должна. Причём, эффект наблюдаю и в 21.0 и в 20.1. Будем разбираться. офф штатные нанотестеры всегда под админами тестируют? Опрометчиво если так. Кстати с СПДС CS была аналогичная проблема в СПДС CS 12 (право первой ночи))) 1 Quote Link to comment Share on other sites More sharing options...
doctorraz Posted March 25, 2021 Report Share Posted March 25, 2021 9 минут назад, ISL сказал: Причём, эффект наблюдаю и в 21.0 и в 20.1. Будем разбираться. эффект своеобразный.. -------------- изначально зарегистрировано на HKEY_USERS\S-1-5-21-1702809543-4080770331-272954124-1001_Classes\nanoCAD.Application =========================== запустил нано 21, register COM есть HKEY_USERS\S-1-5-21-1702809543-4080770331-272954124-1001_Classes\nanoCAD.Application есть ---------------- запустил нано 20 register COM есть HKEY_USERS\S-1-5-21-1702809543-4080770331-272954124-1001_Classes\nanoCAD.Application есть ============== запустил нано 21, HKEY_USERS\S-1-5-21-1702809543-4080770331-272954124-1001_Classes\nanoCAD.Application есть register HKEY_USERS\S-1-5-21-1702809543-4080770331-272954124-1001_Classes\nanoCAD.Application НЕТ COM нет ========================= запустил нано 20 register COM есть HKEY_USERS\S-1-5-21-1702809543-4080770331-272954124-1001_Classes\nanoCAD.Application НЕТ ============= под пользователем раздел создать не может добавлено через 1 минуту хорошо, что я reg сделал))) а нана 21 похоже в ROOT пытается создавать, а надо и достаточно в HKEY_USERS 1 Quote Link to comment Share on other sites More sharing options...
ISL Posted March 25, 2021 Report Share Posted March 25, 2021 Перед /register всегда автоматически проходит /unregister, и он-то похоже, работает правильно. Ломать не строить ;). Quote Link to comment Share on other sites More sharing options...
A.Kudrjashov Posted March 31, 2021 Author Report Share Posted March 31, 2021 (edited) Результаты проверки внешнего подключения скриптов к открытым приложениям nanoCAD. Имеем 3 запущенных приложения nanoCAD: NC21.0, NC20.1, NC20.0 Проверка подключения осуществлялась из PowerShell, VBA, VBScript и JScript. Результаты ожидаемо аналогичные. На данный момент работает подключение через указание классов объектов прописанных в HKEY_CLASSES_ROOT. При этом nanoCAD.Application ссылается на класс NC21. Видимо, прописано по результатам последней установки, так как с настройками вызова приложения "по умолчанию" щелчком мыши в проводник никак не связано. У меня по умолчанию загружается NC20.1 и значение берётся из ключа реестраHKEY_CLASSES_ROOT\nanoCAD x64 Plus.Drawing.20.1\shell\open\command nanoCAD[x64].Application.21.0 ссылается на класс NC21. Что ожидаемо. nanoCAD[x64].Application.20.0 ссылается на класс NC20.1 Видимо, также по результатам последней установки. При этом информации о привязке nanoCAD[x64].Application.20.1 к какому либо классу нет вообще. Как результат, подключиться просто к открытому документу NC20.0 возможности нет ! Ключи реестра: Спойлер nanoCAD_Register_Keys.xlsx Для получения информации о доступных классах можно воспользоваться конструкцией PS>New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT PS>Get-ChildItem HKCR:\ -ErrorAction SilentlyContinue | Where-Object { $_.PSChildName -Like '*nano*' -and (Test-Path -Path "$($_.PSPath)\CLSID") } | Select-Object -ExpandProperty PSChildName nanoCAD x64.Drawing.21.0 nanoCAD.Application nanoCAD.Application.10.0 nanoCAD.Application.11.0 nanoCAD.Application.20.0 nanoCAD.Application.21.0 nanoCAD.Application.5.0 nanoCAD.Application.8.0 nanoCADx64.Application nanoCADx64.Application.10.0 nanoCADx64.Application.11.0 nanoCADx64.Application.20.0 nanoCADx64.Application.21.0 nanoCADx64.Application.8.0 nanoCAD_x64_MECH.Drawing.21.0 nanoCAD_x64_SPDS.Drawing.21.0 Будем надеяться, что рано или поздно ситуация с внешним подключением к объектам nanoCAD придёт к какому то общему знаменателю. Спойлер ... Порядок получения информации из реестра при попытке подключения к открытому приложению из скрипта PowerShell. Запрашивается подключение >$nanoCAD = [Runtime.Interopservices.Marshal]::GetActiveObject('nanoCAD.Application') В реестре опрашивается ветка HKEY_CLASSES_ROOT\nanoCAD.Application\CLSID. Получено значение Default: {2047D158-CCAE-4F79-B460-2D735DF781B6}. В реестре опрашивается ветка HKEY_CLASSES_ROOT\CLSID\{2047D158-CCAE-4F79-B460-2D735DF781B6}\ProgID. Получено значение Default: nanoCADx64.Application.21.0. Запрашивается подключение >$nanoCAD20_0 = [Runtime.Interopservices.Marshal]::GetActiveObject('nanoCAD.Application.20.0') В реестре опрашивается ветка HKEY_USERS\S-1-5-21-1444282386-3698927227-3063026589-2620_Classes\nanoCADx64.Application.20.0\CLSID. Получено значение Default: {0B91A1C9-E134-44E5-9789-D9464453C157}. В реестре опрашивается ветка HKEY_USERS\S-1-5-21-1444282386-3698927227-3063026589-2620_Classes\CLSID\{0B91A1C9-E134-44E5-9789-D9464453C157}\ProgID. Получено значение Default: nanoCADx64.Application.20.0. Запрашивается подключение >$nanoCAD21_0 = [Runtime.Interopservices.Marshal]::GetActiveObject('nanoCAD.Application.20.1') В реестре опрашивается ветка HKEY_CLASSES_ROOT\nanoCADx64.Application.21.0\CLSID. Получено значение Default: {2047D158-CCAE-4F79-B460-2D735DF781B6}. В реестре опрашивается ветка HKEY_CLASSES_ROOT\CLSID\{2047D158-CCAE-4F79-B460-2D735DF781B6}\ProgID. Получено значение Default: nanoCADx64.Application.21.0. Порядок получения информации из реестра при попытке открыть файл в приложении по умолчанию из проводника. В реестре опрашивается ветка HKEY_CLASSES_ROOT\nanoCAD x64 Plus.Drawing.20.1\shell\open\command. Получено значение Default: D:\Program Files\Nanosoft\nanoCAD x64 Plus 20.1\nCad.exe /dde. ... Edited March 31, 2021 by A.Kudrjashov Дополнения 1 Quote Link to comment Share on other sites More sharing options...
doctorraz Posted May 31, 2021 Report Share Posted May 31, 2021 Всежэж вернусь к вопросу ибо оно изрядно хлопот доставляет, в т.ч. анально реализованная регистрация в нана21 собственно вопрос: что мешает сделать, как в клоне нанокада (автокаде) РЕГИСТРАЦИЮ ПРИ ЗАПУСКЕ? спецификация СОМ не обязывает регистрировать объекты но типа жест доброй воли... нана легко может зарегить свой СОМ при старте или есть какие то соображения ограничения? Колитесь делитесь, будем сообща решать думать. нано реально наплодил зоопарк наноприложений, вместо того, что бы сделать одну вертикалку нано и на нее уже вешать нанонавески .. электрики опсы спдсы и прочее 2 Quote Link to comment Share on other sites More sharing options...
AlexGeo Posted January 12 Report Share Posted January 12 (edited) Доброго дня! Кто-то уже тестировал NanoCAD 23? Наше проблему с подключением к открытому экземпляру NanoCAD через COM. Используется C#. Алгоритм следующий: Запуск NanoCAD 23 В тестовом приложении выполняется команда: dynamic app = Marshal.GetActiveObject("nanoCADx64.Application.23.0") В итоге app != null. И все бы хорошо. Но если вдруг app перестает существовать (например объект создавался в рамках отдельной команды, или приложение было закрыто), то нанокад пропадает из списка зарегистрированных приложений для подключения по COM. Т.е. ProgId просто перестает существовать и до него невозможно достучаться ни через nanoCADx64.Application.23.0, ни через другие обращения. Думал, что-то не так у меня в коде, но это можно протестировать, например, и в программе Реверс: Запускаете NanoCAD 23 Запускаете программу Реверс Выбираете Нанокад в настройках подключения Выполняете какие-то действия. Все работает. Закрываете программу Реверс,, снова ее запускаете Все, Реверс уже не может найти Нанокад 23 по progID. На нанокад прошлых версий все работает отлично. Возможно, кто-то подскажет, что в этом случае можно сделать? Я для обхода этой ошибки сделал в своем приложении постоянное хранение объекта app. Но проблема остается, если приложение просто закрыть. При повторном открытии оно не может подключиться к Нанокад 23. Edited January 12 by AlexGeo 2 Quote Link to comment Share on other sites More sharing options...
doctorraz Posted January 12 Report Share Posted January 12 (edited) 25 минут назад, AlexGeo сказал: что в этом случае можно сделать? работать с нано через СОМ "изнутри (через .NET) возможно поправят, потом опять поломают.. через .NET не зависишь от золотых рученек и быстродействие на порядки выше если какие то методы есть только в СОМ (например печать), то "изнутри" подключиться нет проблем добавлено через 0 минут @AlexGeo похоже это очередная бага, открой по ней новую тему Edited January 12 by doctorraz 1 Quote Link to comment Share on other sites More sharing options...
AlexGeo Posted January 12 Report Share Posted January 12 1 минуту назад, doctorraz сказал: хотя похоже это очередная бага Уверен в этом. Моя программа работает через COM Interop с AutoCAD, NanoCAD, BricsCAD и Zwcad. И нигде такой проблемы нет, только в Нанокад 23. Quote Link to comment Share on other sites More sharing options...
ISL Posted January 12 Report Share Posted January 12 Да, это баг. Второе и последующие подключения в 23.0.6116.4106.6223 не работают. В ближайшее время выложим патч. Quote Link to comment Share on other sites More sharing options...
AlexGeo Posted January 12 Report Share Posted January 12 1 минуту назад, ISL сказал: Да, это баг. Второе и последующие подключения в 23.0.6116.4106.6223 не работают. В ближайшее время выложим патч. Тогда я отдельную тему по проблеме не создаю. Жду исправления. Спасибо. Quote Link to comment Share on other sites More sharing options...
AlexGeo Posted January 15 Report Share Posted January 15 В 12.01.2023 в 14:03, ISL сказал: Да, это баг. Второе и последующие подключения в 23.0.6116.4106.6223 не работают. В ближайшее время выложим патч. Подскажите, пожалуйста, в какой срок планируется патч для решения проблем с повторными подключениями? Quote Link to comment Share on other sites More sharing options...
ISL Posted January 16 Report Share Posted January 16 (edited) Патч для сборки 23.0.6116.4106.6223: https://developer.nanocad.ru/redmine/attachments/823. patch_#679_ncauto_23.0.6116.4106.6223_x64.zip Edited January 16 by ISL Добавил патч Quote Link to comment Share on other sites More sharing options...
AlexGeo Posted January 16 Report Share Posted January 16 5 минут назад, ISL сказал: Патч для сборки 23.0.6116.4106.6223: https://developer.nanocad.ru/redmine/attachments/823. Я, к сожалению, не в клубе разработчиков. Подскажите, для простых пользователей будет такой патч? Quote Link to comment Share on other sites More sharing options...
doctorraz Posted January 16 Report Share Posted January 16 1 час назад, ISL сказал: Патч для сборки 23.0.6116.4106.6223 Оперативненько Теперь не отваливается 2 Quote Link to comment Share on other sites More sharing options...
ISL Posted January 16 Report Share Posted January 16 1 час назад, AlexGeo сказал: Я, к сожалению, не в клубе разработчиков. Подскажите, для простых пользователей будет такой патч? Прицепил к исходному сообщению. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.