Как установить путь к двум и более каталогам конфигурации принтеров

Автор Тема: Как установить путь к двум и более каталогам конфигурации принтеров  (Прочитано 9118 раз)

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

Оффлайн Александр РивилисАвтор темы

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

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Почему проверяется Ver <= 12, ведь у 2012 версии Major = 18.
Код - C# [Выбрать]
  1.     public static class Env
  2.     {
  3.         static int Ver = AcAp.Application.Version.Major;
  4.         // AutoCAD 2007...2012
  5.         [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "acedGetEnv")]
  6.         extern static private Int32 acedGetEnv12(string var, StringBuilder val);
  7.         // AutoCAD 2013...
  8.         [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "acedGetEnv")]
  9.         extern static private Int32 acedGetEnv13(string var, StringBuilder val);
  10.         static public string GetEnv(string var)
  11.         {
  12.             StringBuilder val = new StringBuilder(16536);
  13.             if (Ver <= 12) acedGetEnv12(var, val); else acedGetEnv13(var, val);
  14.             return val.ToString();
  15.         }
  16.         // AutoCAD 2007...2012
  17.         [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "acedSetEnv")]
  18.         extern static private Int32 acedSetEnv12(string var, string val);
  19.         // AutoCAD 2013...
  20.         [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "acedSetEnv")]
  21.         extern static private Int32 acedSetEnv13(string var, string val);
  22.         static public void SetEnv(string var, string val)
  23.         {
  24.             if (Ver <= 12) acedSetEnv12(var, val); else acedSetEnv13(var, val);
  25.         }
  26.  
  27.     }

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Почему проверяется Ver <= 12, ведь у 2012 версии Major = 18.
Конечно ты прав. Это опечатка. Исправил.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Doublefish

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Env.GetEnv(var) В 2014 работает нормально, но в AutoCAD 2015 и выше возвращает "пусто", а в режиме отладки работает.
Подскажите пожалуйста, что нужно сделать чтобы это работало в 2015 и выше не только в режиме отладки?
« Последнее редактирование: 07-07-2016, 11:45:37 от Doublefish »

Оффлайн Александр РивилисАвтор темы

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

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вспомнил:
У функции acedGetEnv в ObjectARX 2015 новая сигнатура:
Код - C++ [Выбрать]
  1. int            acedGetEnv (const ACHAR *sym, ACHAR  *var, size_t nBufLen);
вместо той, которая была раньше:
Код - C++ [Выбрать]
  1. int            acedGetEnv (const ACHAR *sym, ACHAR  *var);
Так что код должен быть какой-то такой (не проверял):
Код - C# [Выбрать]
  1. [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "acedGetEnv")]
  2. extern static private Int32 acedGetEnv15(string var, StringBuilder val, UIntPtr valLen);
  3.  
  4. static public string GetEnv(string var)
  5. {
  6.   StringBuilder val = new StringBuilder(16536);
  7.   if (Ver <= 18)
  8.     acedGetEnv12(var, val);
  9.   else if (Ver <= 19)
  10.     acedGetEnv13(var, val);
  11.   else
  12.     acedGetEnv15(var, val, new UIntPtr(16536));
  13.   return val.ToString();
  14. }
« Последнее редактирование: 07-07-2016, 14:15:14 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Doublefish

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
А импорт функции для 2013 у тебя объявлен?
Код - C# [Выбрать]
  1.          // AutoCAD 2013,2014
  2.         [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "acedGetEnv")]
  3.         extern static private Int32 acedGetEnv13(string var, StringBuilder val);

Полный код примерно такой:
Извините, вам запрещён просмотр содержимого спойлеров.

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не задано acedGetEnv13 ...
Я так понимаю, что ты просто заменил
Код - C# [Выбрать]
  1. [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "acedGetEnv")]
  2. extern static private Int32 acedGetEnv13(string var, StringBuilder val);
на
Код - C# [Выбрать]
  1. [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "acedGetEnv")]
  2. extern static private Int32 acedGetEnv15(string var, StringBuilder val, UIntPtr valLen);
вместо того, чтобы добавить это определение.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Doublefish

  • ADN Club
  • ****
  • Сообщений: 288
  • Карма: 10
  • AutoCAD Civil 3D
Всё заработало - спасибо.
Возможно имеет смысл дополнить исходную статью на сайте.

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не проверял, но вроде бы вместо P/Invoke acedGetEnv можно использовать HostApplicationServices.Current.GetEnvironmentVariable:
Код - C# [Выбрать]
  1. static public string GetEnv(string var)
  2. {
  3.   return HostApplicationServices.Current.GetEnvironmentVariable(var);
  4.   //StringBuilder val = new StringBuilder(16536);
  5.   //if (Ver <= 18)
  6.   //  acedGetEnv12(var, val);
  7.   //else if (Ver <= 19)
  8.   //  acedGetEnv13(var, val);
  9.   //else
  10.   //  acedGetEnv15(var, val, new UIntPtr(16536));
  11.   //return val.ToString();
  12. }
« Последнее редактирование: 08-07-2016, 17:48:35 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
А для установки параметра нет метода?

Оффлайн Александр РивилисАвтор темы

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