Не открывается нужный раздел пользовательской справки по нажатию F1

Автор Тема: Не открывается нужный раздел пользовательской справки по нажатию F1  (Прочитано 56674 раз)

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

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
В прошлом не раз успешно регистрировал пользовательскую справку без каких-либо проблем. Видимо что-то подзабыл...

* AutoCAD 2009 SP3 x86 Enu
* AutoCAD 2015 x86 Enu

Ниже в примере, демонстрирующем проблему, определены три команды:
  • ThroughAttribute - регистрация справки для этой команды выполняется через атрибуты.
  • ThroughAcedSetFunHelp - регистрация справки для этой команды выполняется при помощи acedSetFunHelp.
  • ThroughProcess - эта команда создаёт новый процесс и в нём открывает нужный раздел справочной системы.

Во вложении находится соответствующий CHM файл для тестирования - его нужно положить в каталог сборки.

Из приведённых выше вариантов корректно работает только ThroughProcess. В остальных двух не происходит открытие нужного раздела пользовательского файла справочной системы при нажатии клавиши F1 во время выполнения команды: вместо этого открывается файл справки AutoCAD. Добавление каталога сборки в каталоги поиска так же результатов не дали.

Код - C# [Выбрать]
  1. /* Commands.cs
  2.  * © Andrey Bushman, 2014
  3.  * При необходимости закомментируйте или раскомментируйте обозначенные ниже
  4.  * символы компиляции соответственно Вашей версии AutoCAD.
  5.  * В коде определены следующие команды:
  6.  * -  ThroughAttribute
  7.  * -  ThroughAcedSetFunHelp
  8.  * -  ThroughProcess
  9.  */
  10.  
  11. #define AUTOCAD
  12. #define AUTOCAD_NEWER_THAN_2012
  13. #define AUTOCAD_NEWER_THAN_2014
  14.  
  15. using System;
  16. using System.Reflection;
  17. using System.Diagnostics;
  18. using System.IO;
  19. using System.Runtime.InteropServices;
  20.  
  21. #if AUTOCAD
  22. using cad = Autodesk.AutoCAD.ApplicationServices.Application;
  23. using Ap = Autodesk.AutoCAD.ApplicationServices;
  24. using Db = Autodesk.AutoCAD.DatabaseServices;
  25. using Ed = Autodesk.AutoCAD.EditorInput;
  26. using Rt = Autodesk.AutoCAD.Runtime;
  27. #endif
  28.  
  29. [assembly: Rt.ExtensionApplication(typeof(Bushman.CAD.Samples.Help
  30.   .ExtensionApplication))]
  31. [assembly: Rt.CommandClass(typeof(Bushman.CAD.Samples.Help.Commands))]
  32.  
  33. namespace Bushman.CAD.Samples.Help {
  34.   /// <summary>
  35.   /// Класс, в котором определён набор пользовательских команд AutoCAD
  36.   /// </summary>
  37.   public sealed class Commands {
  38.  
  39.     #region PInvoke
  40.  
  41. #if AUTOCAD_NEWER_THAN_2012
  42.     const String fnc_location = "accore.dll";
  43. #else
  44.     const String fnc_location = "acad.exe";
  45. #endif
  46.  
  47. #if AUTOCAD_NEWER_THAN_2014
  48.     const String x86_Prefix = "_";
  49. #else
  50.     const String x86_Prefix = "";
  51. #endif
  52.  
  53.     #region acedSetFunHelp
  54.     const String acedSetFunHelp_Name = "acedSetFunHelp";
  55.  
  56.     [DllImport(fnc_location, CharSet = CharSet.Auto,
  57.       CallingConvention = CallingConvention.Cdecl,
  58.       EntryPoint = "acedSetFunHelp")]
  59.     private static extern Int32 acedSetFunHelp_x64(
  60.         String functionName,
  61.         String helpFile,
  62.         String helpTopic,
  63.         Int32 cmd);
  64.  
  65.     [DllImport(fnc_location, CharSet = CharSet.Auto,
  66.       CallingConvention = CallingConvention.Cdecl,
  67.       EntryPoint = x86_Prefix + "acedSetFunHelp")]
  68.     private static extern Int32 acedSetFunHelp_x86(
  69.         String functionName,
  70.         String helpFile,
  71.         String helpTopic,
  72.         Int32 cmd);
  73.  
  74.  
  75.     internal static Int32 acedSetFunHelp(
  76.         String functionName,
  77.         String helpFile,
  78.         String helpTopic,
  79.         Int32 cmd) {
  80.       if(IntPtr.Size == 4)
  81.         return acedSetFunHelp_x86(functionName, helpFile, helpTopic, cmd);
  82.       else
  83.         return acedSetFunHelp_x64(functionName, helpFile, helpTopic, cmd);
  84.     }
  85.     #endregion // acedSetFunHelp
  86.     #endregion // PInvoke
  87.  
  88.     const String commandGroup = "Bushman";
  89.     const String throughAttribute = "ThroughAttribute";
  90.     internal const String throughAcedSetFunHelp = "ThroughAcedSetFunHelp";
  91.     const String throughProcess = "ThroughProcess";
  92.     const String helpPageExtension = ".htm";
  93.     const String chmFileName = "MyHelp.chm";
  94.     internal static readonly String asm_location = Path.GetDirectoryName(
  95.       Assembly.GetExecutingAssembly().Location);
  96.     // Предположим, что файл справки хранится в том же каталоге, что и DLL.
  97.     internal static readonly String chmFileFullName = Path.Combine(
  98.       asm_location, chmFileName);
  99.  
  100.     const String f1_msg = "\nНажмите клавишу F1 для открытия нужного " +
  101.         "раздела справочной системы.\n";
  102.  
  103.     /// <summary>
  104.     /// Пример открытия нужного раздела справки при помощи нажатия клавиши
  105.     /// F1 в момент выполнения команды (регистрация через атрибуты метода).
  106.     /// </summary>
  107.     [Rt.CommandMethod(commandGroup, throughAttribute, null,
  108.       Rt.CommandFlags.Session, null, chmFileName, throughAttribute)]
  109.     public void ThroughAttribute_Command() {
  110.       Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
  111.       if(null == doc) {
  112.         return;
  113.       }
  114.       doc.Editor.GetPoint(f1_msg);
  115.     }
  116.  
  117.     /// <summary>
  118.     /// Пример открытия нужного раздела справки при помощи нажатия клавиши
  119.     /// F1 в момент выполнения команды (регистрация через функцию
  120.     /// acedSetFunHelp).
  121.     /// </summary>
  122.     [Rt.CommandMethod(commandGroup, throughAcedSetFunHelp,
  123.       Rt.CommandFlags.Session)]
  124.     public void ThroughAcedSetFunHelp_Command() {
  125.  
  126.       Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
  127.       if(null == doc) {
  128.         return;
  129.       }
  130.       doc.Editor.GetPoint(f1_msg);
  131.     }
  132.  
  133.     /// <summary>
  134.     /// Пример открытия нужного раздела справки при помощи запуска внешнего
  135.     /// процесса с передачей ему необходимого параметра
  136.     /// </summary>
  137.     [Rt.CommandMethod(commandGroup, throughProcess, Rt.CommandFlags.Session)]
  138.     public void ThroughProcess_Command() {
  139.       Process process = new Process();
  140.  
  141.       String parameter = String.Format("mk:@MSITStore:{0}::/{1}{2}",
  142.         chmFileFullName.Replace(" ", "%20"), throughProcess, helpPageExtension);
  143.       ProcessStartInfo info = new ProcessStartInfo("hh", parameter);
  144.       process.StartInfo = info;
  145.       process.Start();
  146.     }
  147.   }
  148.  
  149.   /// <summary>
  150.   /// Класс, реализующий интерфейс IExtensionApplication.
  151.   /// </summary>
  152.   public sealed class ExtensionApplication : Rt.IExtensionApplication {
  153.  
  154.     /// <summary>
  155.     /// Код этого метода будет выполнен сразу после загрузки данной сборки.
  156.     /// </summary>
  157.     public void Initialize() {      
  158.       Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
  159.       if(null == doc) {
  160.         cad.DocumentManager.DocumentActivated += DocumentActivated;
  161.         return;
  162.       }
  163.       WriteLoadingReport(doc);
  164.     }
  165.  
  166.     void DocumentActivated(object sender, Ap.DocumentCollectionEventArgs e) {
  167.       cad.DocumentManager.DocumentActivated -= DocumentActivated;
  168.       Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
  169.       WriteLoadingReport(doc);
  170.     }
  171.  
  172.     private static void WriteLoadingReport(Ap.Document doc) {
  173.  
  174.       if(null == doc)
  175.         throw new ArgumentNullException("doc");
  176.       if(doc.IsDisposed)
  177.         throw new ArgumentException("doc.IsDisposed == true");
  178.  
  179.       using(doc.LockDocument()) {
  180.         String format = String.Empty;
  181.  
  182.         doc.Editor.WriteMessage("\nСборка \"{0}\" успешно загружена.\n",
  183.           Assembly.GetExecutingAssembly().Location);
  184.  
  185.         if(File.Exists(Commands.chmFileFullName)) {
  186.           Commands.acedSetFunHelp(Commands.throughAcedSetFunHelp,
  187.             Commands.chmFileFullName, Commands.throughAcedSetFunHelp, 0);
  188.           format = "\nФайл \"{0}\" найден. Регистрация раздела справки " +
  189.             "выполнена.\n";
  190.         }
  191.         else
  192.           format = "\nФайл \"{0}\" не найден.\n";
  193.  
  194.         doc.Editor.WriteMessage(format, Commands.chmFileFullName);        
  195.       }
  196.     }
  197.  
  198.     public void Terminate() { }
  199.   }
  200. }
Почему не открывается файл справочной системы, регистрацию которого я выполняю?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Пока проверил в AutoCAD 2013 x86 в Windows XP SP3 и AutoCAD 2013 x64 Windows 7 - всё работает. Повторить ошибку не смог.

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

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Цитировать
Command: NETLOAD
Сборка "E:\_Profiles\Visual Studio 2010\Projects\MyHelp\MyHelp\bin\Debug\MyHelp.dll" успешно загружена.
Файл "E:\_Profiles\Visual Studio 2010\Projects\MyHelp\MyHelp\bin\Debug\MyHelp.chm" найден. Регистрация раздела справки выполнена.
Command: THROUGHATTRIBUTE
Нажмите клавишу F1 для открытия нужного раздела справочной системы.
: *Cancel*
Command: *Cancel*
Command: THROUGHACEDSETFUNHELP
Нажмите клавишу F1 для открытия нужного раздела справочной системы.
: *Cancel*
Command: THROUGHPROCESS
Command: *Cancel*

Справка открылась в соответствующих разделах все 3 раза.
AutoCAD 2014 x64 , Win7 x64

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Boxa.Shu, спасибо!
Не очень понятно откуда берется *Cancel*.
p.S.: Хотел уточнить - запуск у тебя от имени Администратора идет или от обычного пользователя?
« Последнее редактирование: 25-06-2014, 17:08:06 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
ACAD 2010 Win7*32 - как и у автора - ThroughProcess - вызывает нужную справку, в остальных случаях по F1 - выскакивает автокадная.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Я проверял на пяти компьютерах:

- у двоих пользователей
- на двоих виртуальных машинках
- на домашнем ноутбуке

Везде результат один и тот же - тот, что обозначен мною в первом сообщении темы.

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Не очень понятно откуда берется *Cancel*.
p.S.: Хотел уточнить - запуск у тебя от имени Администратора идет или от обычного пользователя?
Я на Esc тыкал =) ,  запускал в режиме отладке из студии, студия вроде бы без админских прав запускается (соответствующие галочки сняты)
Тут видео:

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
ACAD 2010 Win7*32 - как и у автора - ThroughProcess - вызывает нужную справку, в остальных случаях по F1 - выскакивает автокадная.
Дима. А что в командной строке при загрузке dll?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Я уж стер - но было все в порядке - сборка загруженна, регистрация выполнена... (одна команда то работает).

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Проверил в AutoCAD 2015 SP1 x64 Win 7 x64 - всё работает. Такое чувство, что от версии AutoCAD не зависит.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Проверил еще в x64 AutoCAD 2012, 2013, 2014 - всё нормально
Проверил на всякий случай в x86 AutoCAD 2008, но в Win7 X64 - работает только последний вариант. При этом в этом же AutoCAD'е но в Windows XP x86 работает нормально.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
и тем не менее проблема есть, она не может не есть...

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Пока я ничего не могу отправить в ADN DevHelp, т.к. на своём PC не могу ни подтвердить, ни опровергнуть наличие ошибки в последних трёх версиях AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Acad 2014*64, Win8.1:
сборка и файл помощи на рабочем столе:
сборка загруженна успешно, регистрация выполненна
THROUGHATTRIBUTE - автокад ругается что такого файла нету, после загружает свою справку
THROUGHACEDSETFUNHELP - открывает "правильную" справку - курсор на пункте about (в 2010 был на "своем" месте)
THROUGHPROCESS - открывает "правильную" справку - курсор на пункте about

сборка на рабочем столе, файл справки в папке автокада:
сборка загруженна успешно, файл справки не найден
THROUGHATTRIBUTE - открывает "правильную" справку - курсор на пункте about
THROUGHACEDSETFUNHELP - автокад "молча" загружает свою справку
THROUGHPROCESS - ругается что не удается открыть справку

в общем, как минимум, явно разные api в разные места смотрят...