Jump to content

Подключение к открытому экземпляру nanoCAD


Recommended Posts

Предыстория.

На сегодняшний день имеем уже 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

 

Мы получаем

Спойлер

image.thumb.png.aec6726560326a8d857d8bc50857f91f.png


При запущенном только nanoCAD 20.1 и не запущенном nanoCAD 21.0 получаем ошибку.

 

При попытке создать новый объект, запускается опять таки именно приложение nanoCAD 21.0.

 

При этом в реестре видно, что "приложение по умолчанию" зарегистрировано как положено на nanoCAD 20.1

Спойлер

image.thumb.png.c3b8e1eca38b9c4e0adaf0aed367dac8.png

 

Спойлер

image.thumb.png.a99f97eadc898fa1db217775b26499b9.png

 

 

 

 

  • Thanks 1
Link to comment
Share on other sites

Странно выглядит реестр. А где в нём 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.

Link to comment
Share on other sites

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 битная версия.
Во вторых, разницы никакой

Спойлер

image.thumb.png.1802ab77c65d38f5730bf3fb42753e3d.png

 

Edited by A.Kudrjashov
Дополнения
Link to comment
Share on other sites

21-я и 20-я версия в реестре различаются, после ncad.exe /register ключ HKEY_CLASSES_ROOT\nanoCADx64.Application.21.0 появляется. Аналогично и после установки, инсталлятор тоже зовёт ncad.exe /register.

Link to comment
Share on other sites

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 его нет ...

Спойлер

image.thumb.png.25bbc1f7da1763155336b67f058fb980.png



P.S. Кстати, после того, как я перерегистрировал запуск на NC20.x обратно зарегистрировать "по умолчанию" через >Ncad.exe /register nanoCAD 21.0 на запуск по умолчанию уже не получается. :(

Edited by A.Kudrjashov
Дополнения
  • Thanks 1
Link to comment
Share on other sites

6 минут назад, A.Kudrjashov сказал:

Ncad.exe /register nanoCAD 21.0 на запуск по умолчанию уже не получается

аналогично

доигрался я...

register на нану 21 не срабатывает(((

  • Like 1
Link to comment
Share on other sites

> 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;
}

 

Link to comment
Share on other sites

Только что, ISL сказал:

Значит, не под текущим пользователем смотрите

под текущим пользователем раздела nanoCAD.Application вообще не было

сделал ручками, прописал ключи, COM интерфейс заработал

Спойлер

image.png.3ef9be1d7a3cc510798e01a72426188c.png

@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 с этим проблемы.

  • Like 1
Link to comment
Share on other sites

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

Спойлер

image.thumb.png.f4862815c15f1a723d4acbd0b8dffe7e.png



 

Link to comment
Share on other sites

Действительно, под ограниченным пользователем регистрация не работает, а должна. Причём, эффект наблюдаю и в 21.0 и в 20.1. Будем разбираться.

Link to comment
Share on other sites

4 минуты назад, ISL сказал:

Действительно, под ограниченным пользователем регистрация не работает, а должна. Причём, эффект наблюдаю и в 21.0 и в 20.1. Будем разбираться.

офф штатные нанотестеры всегда под админами тестируют?

Опрометчиво если так.

Кстати с СПДС CS была аналогичная проблема в СПДС CS 12 (право первой ночи)))

  • Like 1
Link to comment
Share on other sites

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

  • Like 1
Link to comment
Share on other sites

Перед /register всегда автоматически проходит /unregister, и он-то похоже, работает правильно. Ломать не строить ;).

Link to comment
Share on other sites

Результаты проверки внешнего подключения скриптов к открытым приложениям 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 возможности нет !

Ключи реестра:

Спойлер

image.thumb.png.70dd60265b1bf05f2617ca18b5d4ce0b.png

 

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 by A.Kudrjashov
Дополнения
  • Like 1
Link to comment
Share on other sites

  • 2 months later...

Всежэж вернусь к вопросу ибо оно изрядно хлопот доставляет, в т.ч.  анально реализованная регистрация в нана21

собственно вопрос:

что мешает сделать, как в клоне нанокада (автокаде) 

РЕГИСТРАЦИЮ ПРИ ЗАПУСКЕ?

спецификация СОМ не обязывает регистрировать объекты

но типа жест доброй воли... нана легко может зарегить свой СОМ при старте

или есть какие то соображения ограничения? Колитесь делитесь, будем сообща решать думать.

нано реально наплодил зоопарк наноприложений, вместо  того, что бы сделать одну вертикалку нано и на нее уже вешать нанонавески .. электрики опсы спдсы и прочее

 

  • Like 2
Link to comment
Share on other sites

  • 1 year later...

Доброго дня!

Кто-то уже тестировал NanoCAD 23? Наше проблему с подключением к открытому экземпляру NanoCAD через COM. Используется C#.

Алгоритм следующий:

  1. Запуск NanoCAD 23
  2. В тестовом приложении выполняется команда: dynamic app = Marshal.GetActiveObject("nanoCADx64.Application.23.0")
  3. В итоге app != null.

И все бы хорошо. Но если вдруг app перестает существовать (например объект создавался в рамках отдельной команды, или приложение было закрыто), то нанокад пропадает из списка зарегистрированных приложений для подключения по COM. Т.е. ProgId просто перестает существовать и до него невозможно достучаться ни через nanoCADx64.Application.23.0, ни через другие обращения.

 

Думал, что-то не так у меня в коде, но это можно протестировать, например, и в программе Реверс:

  1. Запускаете NanoCAD 23
  2. Запускаете программу Реверс
  3. Выбираете Нанокад в настройках подключения
  4. Выполняете какие-то действия. Все работает.
  5. Закрываете программу Реверс,, снова ее запускаете
  6. Все, Реверс уже не может найти Нанокад 23 по progID.

На нанокад прошлых версий все работает отлично.

Возможно, кто-то подскажет, что в этом случае можно сделать? Я для обхода этой ошибки сделал в своем приложении постоянное хранение объекта app. Но проблема остается, если приложение просто закрыть. При повторном открытии оно не может подключиться к Нанокад 23.

Edited by AlexGeo
  • Like 2
Link to comment
Share on other sites

25 минут назад, AlexGeo сказал:

что в этом случае можно сделать?

работать с нано через СОМ "изнутри (через .NET)

возможно поправят, потом опять поломают..

через .NET не зависишь от золотых рученек и быстродействие на порядки выше

если какие то методы есть только в СОМ (например печать), то "изнутри" подключиться нет проблем

добавлено через 0 минут

@AlexGeo похоже это очередная бага, открой по ней новую тему

Edited by doctorraz
  • Like 1
Link to comment
Share on other sites

1 минуту назад, doctorraz сказал:

хотя похоже это очередная бага

 

Уверен в этом. Моя программа работает через COM Interop с AutoCAD, NanoCAD, BricsCAD и Zwcad. И нигде такой проблемы нет, только в Нанокад 23.

 

Link to comment
Share on other sites

Да, это баг. Второе и последующие подключения в 23.0.6116.4106.6223 не работают. В ближайшее время выложим патч.

Link to comment
Share on other sites

1 минуту назад, ISL сказал:

Да, это баг. Второе и последующие подключения в 23.0.6116.4106.6223 не работают. В ближайшее время выложим патч.

 

Тогда я отдельную тему по проблеме не создаю. Жду исправления. Спасибо.

Link to comment
Share on other sites

В 12.01.2023 в 14:03, ISL сказал:

Да, это баг. Второе и последующие подключения в 23.0.6116.4106.6223 не работают. В ближайшее время выложим патч.

 

Подскажите, пожалуйста, в какой срок планируется патч для решения проблем с повторными подключениями?

Link to comment
Share on other sites

1 час назад, ISL сказал:

Патч для сборки 23.0.6116.4106.6223

Оперативненько yahoo.gif.472907a0afa03f665da7fb0b7e3036de.gif

Теперь не отваливается nice.gif.cab82f182d6a55ae03eb044d3cc7e848.gif

  • Like 2
Link to comment
Share on other sites

1 час назад, AlexGeo сказал:

 

Я, к сожалению, не в клубе разработчиков. Подскажите, для простых пользователей будет такой патч?

 

Прицепил к исходному сообщению.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Tell a friend

    Love Официальный форум компании Нанософт? Tell a friend!
×
×
  • Create New...