Получить список всех установленных AutoCAD

Автор Тема: Получить список всех установленных AutoCAD  (Прочитано 5406 раз)

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

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Сделал такой алгоритм для получения списка установленных AutoCAD на COM.

Что-то мне такой алгоритм не нравится тем, что запускаются процессы.
Это работает долго. Да еще всякие ошибки могут быть у пользователя при запуске AutoCAD
или различные сообщения которые будут "висеть" модально и т.п. вещи.
Можно решить эту задачу не запуская процессов AutoCAD, а просто проверить
к примеру чтением ключей из реестра. Хотя реестр не очень хочется использовать.
Может на .NET есть какое решение.
Задача нужна только для обнаружения autocad 2006 по 2015.

Код - vb.net [Выбрать]
  1. Dim ver() As String = {"16.2:2006", "17.0:2007", "17.1:2008", _
  2.                "17.2:2009", "18.0:2010", "18.1:2011", _
  3.                "18.2:2012", "19.0:2013", "19.1:2014", "20.0:2015"}
  4.         For i As Integer = 0 To ver.Length - 1
  5.             Try
  6.                 Dim Acapp As Object = Nothing
  7.                 Dim V() As String = ver(i).Split(":")
  8.                 Acapp = CreateObject("AutoCAD.Application." & V(0))
  9.                 If Acapp IsNot Nothing Then
  10.                     acadLIST.Items.Add("AutoCAD " & V(1)) ' добавл. в (CheckListBox) список имен AutoCAD
  11.                 End If
  12.                 Acapp.Quit()
  13.             Catch ex As Exception
  14.             End Try
  15.         Next

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
У Сэр как у вас всё запущено. :D Я не буду критиковать код, тем более что в ряде случае он в принципе не может работать.
А если серьезно, то конечно же нужен другой подход, и конечно же именно работа с реестром. Точнее с ветками реестра и всеми их подветками:
Код - Microsoft Registry [Выбрать]
  1. HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD
Код - Microsoft Registry [Выбрать]
  1. HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Autodesk\AutoCAD
Андрей Бушман занимался исследованиями в этой области, поэтому дам сразу ссылку на его сайт: http://bushman-andrey.blogspot.com/2014/02/windows-x64.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Спасибо за ответ.
Я получил подтверждение, тому, что этот применять нельзя.
Я его применять не буду (он тормозной и не работает) и другим не советую.
Получается что показал людям как не нужно писать.
Думаю что лучше будет прочитать ключики из реестра.


Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Может на .NET есть какое решение.
Какое-то есть. Обозначенная библиотека предоставляет информацию об установленных версиях AutoCAD и позволяет управлять их настройками. Может использоваться как в составе плагинов AutoCAD, так и в автономных приложениях. Я использовал её для конфигурирования установленных AutoCAD, а так же для управления автозагрузкой в них плагинов (ARX\LISP\.NET\VBA) - по ссылке показаны скрины GUI приложения, построенного на базе обозначенной мною библиотеки.

В CHM файле справки имеется такой пример (как раз отвечающий на вопрос топик-стартера):
Код - C# [Выбрать]
  1. using System;
  2. using ab = AndreyBushman.AutoCAD;
  3.  
  4. namespace ConsoleAcadInfoTesting {
  5.     class Program {
  6.         static void Main(string[] args) {
  7.             Console.Title = "AcadInfo using";
  8.  
  9.             // Get installed AutoCAD applications for local machine
  10.             ab.AcadInfo[] localAcads = ab.AcadInfo.GetInstalledAutoCADs();
  11.  
  12.             // For receiving this information from network computer, you must have necessary
  13.             // permissions:
  14.             //String networkComputerName = "Bushman";
  15.             //ab.AcadInfo[] remoteAcads = ab.AcadInfo.GetInstalledAutoCADs(networkComputerName);
  16.  
  17.             // The localAcads will be null, if AutoCAD applications not found.
  18.             if (null != localAcads) {
  19.                 foreach (ab.AcadInfo acad in localAcads) {
  20.                     // Display a some info:
  21.                     Console.WriteLine("Application: {0}", acad.ProductName);
  22.                     Console.WriteLine("Location: {0}", acad.Location);
  23.  
  24.                     // Relative path, since can be used as in HKLM, as in HKCU.
  25.                     Console.WriteLine("Acad Registry: {0}", acad.AcadRegistry);
  26.                     Console.WriteLine("Patch title: {0}", acad.PatchTitle);
  27.  
  28.                     // Full path, since always located in HKLM
  29.                     Console.WriteLine("SP Registry: {0}", acad.ServicePackRegistry);
  30.  
  31.                     Console.WriteLine("Release: {0}", acad.Release);
  32.                     Console.WriteLine("Language: {0}", acad.Language);
  33.                     Console.WriteLine();
  34.  
  35.                     Console.WriteLine(@"Count plugins, registered in HKLM\...\Applications: {0}",
  36.                         acad.HKLMApplications.Count);
  37.  
  38.                     // If AutoCAD was installed, but was not run in a current windows profile,
  39.                     // then a necessary registry key in HKCU will be absent
  40.                     Int32 count = acad.HKCUApplications == null ? 0 : acad.HKCUApplications.Count;
  41.  
  42.                     Console.WriteLine(@"Count plugins, registered in HKCU\...\Applications: {0}", count);
  43.  
  44.                     // If AutoCAD was installed, but was not run in a current windows profile,
  45.                     // then a necessary registry key in HKCU will be absent
  46.                     count = acad.Startup == null ? 0 : acad.Startup.Length;
  47.                     Console.WriteLine(@"Count existence AutoCAD profiles in HKCU\...\Profiless: {0}", count);
  48.  
  49.                     Console.WriteLine();
  50.                     Console.WriteLine(new String('*', 10));
  51.                     Console.WriteLine();
  52.                 }
  53.             }
  54.             else {
  55.                 Console.WriteLine("AutoCAD applications not found.");
  56.             }
  57.             // Display a count of bundle plugins
  58.             Console.WriteLine(@"Count of BUNDLE plugins in %ProgramFiles%\...\: {0}",
  59.                 ab.AcadInfo.ProgramFileBundles.Count);
  60.             Console.WriteLine(@"Count of BUNDLE plugins in %AppData%\...\: {0}",
  61.                 ab.AcadInfo.AppDataBundles.Count);
  62.             Console.WriteLine();
  63.  
  64.             Console.WriteLine("Press any key for exit...");
  65.             Console.ReadKey();
  66.         }
  67.     }
  68. }

В результате работы кода на консоль выводится следующая информация (зависит от состава установленных AutoCAD):

Цитата: Console output
Application: AutoCAD 2009
Location: C:\Program Files\AutoCAD 2009
Acad Registry: SOFTWARE\Autodesk\AutoCAD\R17.2\ACAD-7001:409
Patch title: AutoCAD 2009 - English Version 4
SP Registry: HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R17.2\ACAD-7001:409\Service Packs\AutoCAD 2009 - English
Release: 17.2.711.0
Language: English

Count plugins, registered in HKLM\...\Applications: 158
Count plugins, registered in HKCU\...\Applications: 2
Count existence AutoCAD profiles in HKCU\...\Profiless: 2

**********

Application: AutoCAD 2010
Location: C:\Program Files\AutoCAD 2010
Acad Registry: SOFTWARE\Autodesk\AutoCAD\R18.0\ACAD-8001:409
Patch title: AutoCAD 2010 - English Version 3
SP Registry: HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R18.0\ACAD-8001:409\Service Packs\AutoCAD 2010 - English
Release: 18.0.309.0
Language: English

Count plugins, registered in HKLM\...\Applications: 196
Count plugins, registered in HKCU\...\Applications: 1
Count existence AutoCAD profiles in HKCU\...\Profiless: 2

**********

Application: AutoCAD 2011
Location: C:\Program Files\Autodesk\AutoCAD 2011
Acad Registry: SOFTWARE\Autodesk\AutoCAD\R18.1\ACAD-9001:409
Patch title: AutoCAD 2011 - English Version 3
SP Registry: HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R18.1\ACAD-9001:409\Service Packs\AutoCAD 2011 - English
Release: 18.1.208.0
Language: English

Count plugins, registered in HKLM\...\Applications: 204
Count plugins, registered in HKCU\...\Applications: 0
Count existence AutoCAD profiles in HKCU\...\Profiless: 2

**********

Application: AutoCAD 2012 - English
Location: C:\Program Files\Autodesk\AutoCAD 2012 - English
Acad Registry: SOFTWARE\Autodesk\AutoCAD\R18.2\ACAD-A001:409
Patch title: AutoCAD 2012 - English SP2
SP Registry: HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R18.2\ACAD-A001:409\Service Packs\AutoCAD 2012 - English
Release: 18.2.205.0
Language: English

Count plugins, registered in HKLM\...\Applications: 212
Count plugins, registered in HKCU\...\Applications: 0
Count existence AutoCAD profiles in HKCU\...\Profiless: 2

**********

Application: AutoCAD 2013 - English
Location: C:\Program Files\Autodesk\AutoCAD 2013
Acad Registry: SOFTWARE\Autodesk\AutoCAD\R19.0\ACAD-B001:409
Patch title: AutoCAD 2013 SP1.1
SP Registry: HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\AutoCAD\R19.0\ACAD-B001\Service Packs\AutoCAD 2013
Release: 19.0.114.0
Language: English

Count plugins, registered in HKLM\...\Applications: 234
Count plugins, registered in HKCU\...\Applications: 1
Count existence AutoCAD profiles in HKCU\...\Profiless: 2

**********

Count of BUNDLE plugins in %ProgramFiles%\...\: 2
Count of BUNDLE plugins in %AppData%\...\: 1

Press any key for exit...
« Последнее редактирование: 25-06-2014, 11:53:40 от Андрей Бушман »