Как загрузить файл dll в автокад
Каждый раз, как мне надо собрать новую ресурсную dll, я судорожно начинаю искать нужную информацию. Надоело! Все, что посчитаю важным, закину сюда.
С любезного разрешения Андрея Бушмана почти полностью дублирую его статью. Скрины, взятые у Андрея, дополню (ну просто для себя) скринами с VS2015 CommunityEdition. Собственные комментарии и уточнения буду писать курсивом.
Статья написана для AutoCAD 2009, но прекрасно срабатывает и на других версиях AutoCAD.
Графические изображения, которые используются в CUI файлах, могут браться как из внешних BMP файлов, так и из неуправляемого DLL файла ресурсов, в который эти изображения помещены. Второй способ более удобен в использовании. Здесь рассматривается, как создавать такие DLL файлы и как их использовать в CUI файлах.
AutoCAD давно (начиная с версии 2010) использует формат CUIX в качестве частичных файлов меню, представляющий собой обычный архив, расширение которого переименовано с ZIP на CUIX. Однако в нашей компании используется AutoCAD 2009 SP3, который не умеет работать с CUIX, но использует более старый формат - CUI файлы, содержимое которых представлено в формате XML.
Кроме того, начиная с версии 2015, если не ошибаюсь, в AutoCAD введены два варианта оформления - темная тема и светлая тема. Сделать иконку, которая будет видна и там, и там, очень сложно. А имя картинки менять "на лету" не самое лучшее решение. Подробнее - ниже.
Создание DLL файла ресурсов
В MS Visual Studio 2012 создаём новый проект, на основе шаблона Empty Project и назначаем ему нужное имя:
Первым делом сразу устанавливаем конфигурацию в Release Win32:
Теперь в окне Solution Explorer нажимаем правой кнопкой мыши на имени проекта и в появившемся контекстном меню выбираем пункт Properties . Назначаем нужные значения свойствам Target Extension и Configuration Type :
Кроме этого, в настройках проекта нужно изменить ещё одну опцию - No Entry Point:
Произведя обозначенные выше изменения, жмём кнопку Применить и ОК . Теперь свойства нашего, пока ещё пустого проекта настроены должным образом. На вкладке Solution Explorer , из контекстного меню проекта, выбираем пункт Add -> New Item. и в появившемся диалоговом окне выбираем шаблон файла ресурсов:
Имя файлу можно назначить любое, в нашем примере оставляем Resource.rc . Жмём кнопку Add . Добавленный нами файл будет содержать в себе перечень изображений, которые будут использоваться в наших CUI(x) файлах.
Андрей рекомендует картинки, которые будут "загоняться" в dll, помещать в подкаталог \images. Вполне разумная рекомендация, хотя и не критична. Другой вопрос, что настоятельно рекомендую все же помещать ресурсы так, чтобы для них можно было "вычислить" относительный путь. Очень помогает, если разработка ведется не на одном рабочем месте.
В качестве эксперимента добавим BMP файлы разных размеров: 16x16, 24x24, 32x32, 48x48, 64x64 и 128x128. Кнопки на палитрах инструментов должны содержать изображения размером 16x16, а кнопки, размещённые на палитрах Ribbon, имеют размеры поболее. В нашем тестовом CUI файле разместим кнопки с указанными выше разрешениями и там и там, дабы посмотреть результат использования различных размеров.
Можно было бы копировать и файлы в формате PNG, однако AutoCAD 2009 не умеет в CUI файлах использовать изображения такого формата.
Уточнение: можно попытаться подключать не *.bmp, а *.ico-файлы. Потребуется, конечно, некоторая дополнительная работа, но это возможно.
В старых версиях для обеспечения "прозрачности" фона следует использовать цвет RGB 192,192,192. Старые версии AutoCAD обрабатывают его как прозрачный.
И вот еще - AutoCAD2018 уже не "понимает" bmp, и требует как раз png
Теперь возвращаемся к нашей IDE: переключаемся на вкладку Resource View .
Из контекстного меню элемента Resource.rc вызываем пункт Add Resource.
В диалоговом окне Add Resource в списке Resource type выбираем элемент Bitmap , жмём кнопку Import. и указываем BMP файлы из созданного нами ранее подкаталога \images. Получаем такой результат (вид абсолютно одинаков что для 2012, что для 2015)
Теперь для каждого элемента значение свойства ID нужно обособить двойными кавычками, чтобы их можно было успешно использовать в наших CUI(x) файлах:
Всё, теперь компилируем наш DLL файл (клавиша F6 или через меню Build -> Build Solution ).
Конец цитирования, дальнейшие действия по использованию DLL пропишу потом, если вдруг понадобится.
Теперь кое-что из собственного (и не только собственного) опыта.
Подобная технология прекрасно работает при использовании частичных файлов адаптации. Если попробовать собрать такую dll для корпоративного файла адаптации, то заменить уже имеющуюся dll не получится: сначала все пользователи должны выключить AutoCAD.
Имя dll должно совпадать с именем cui(x) файла. Крайне желательно положить dll рядом с cui(x) файлом. Теоретически можно ее просто закинуть в пути поддержки, но лично я подобным никогда не занимался - потом замучаешься искать.
По поводу тем оформления, как было обещано, на основе информации на форуме ADN-CIS и справки Autodesk:
- В версиях AutoCAD без темы оформления ресурсы забирались из dll, имеющей то же имя, что и файл cui(x)
- В версиях AutoCAD с темами оформления необходимо создать отдельный ресурс DLL для каждой темы: светлой и темной. Соответствующий DLL ресурса используется на основе того, какая тема в настоящий момент применена к пользовательскому интерфейсу. По соглашению об именовании файлов DLL требуется использовать то же имя, что и имя файла адаптации, но также необходимо добавить суффикс "_light" для файла DLL, который будет использоваться в качестве светлой темы. Например, если загружен файл CUIx под именем mymenu.cuix , AutoCAD выполняет поиск файла библиотеки ресурсов mymenu_light.dll , если используется светлая тема, и файла mymenu.dll , если используется темная тема.
Последовательность компиляции библиотек с учетом варианта темы оформления отлично описал Дмитрий Загорулькин:
. CUIX-файл делал один на версии 2014-2016, проблем с этим не было. Также, сделал два C++ проекта с ресурсными иконочными DLL - один для темной схемы, второй - для светлой. В настройках проектов в разделе "Build Events - Post Build Events" можно настроить события таким образом, чтобы создаваемые dll файлы после сборки сразу копировались в нужные папки под нужным названием. В папку для 2014 версии - только "светлая" dll без суффикса, в папку для версий 2015-2016 - "светлая" с суффиксом "_light", "темная" - без суффикса. Я сперва так делал, а потом настроил то же самое но уже в проекте WIX-инсталлятора. В общем, каким образом ни делай, есть возможность один раз настроить и уже потом не думать откуда и какие файлы нужно скопировать и как назвать - все делается автоматически.
Как AutoCAD определяет, какой DLL подгружать:
- в версиях до 2014 включительно подгружается только та DLL с иконками, название которой совпадает с названием файла CIUX. К примеру, есть файл: "MyTools.cuix", иконки для этого файла ищутся в файле "MyTools.dll".
- в версиях 2015-2016 для темной схемы подгружается DLL, совпадающая с названием CUIX, для светлой - название с суффиксом "_light". Пример: "MyTools.cuix", иконки для темной схемы: "MyTools.dll", для светлой: "MyTools_light.dll".
Еще один неочевидный момент. Можно создавать один ICO файл для иконок 16х16 и 32х32. Для этого внутрь ICO нужно поместить два соответствующих изображения. В настройках кнопки указывается при этом одинаковый ID изображения для большой и маленькой кнопки. AutoCAD сам выберет иконку в зависимости от размера выводимого изображения. Этот прием позволяет сильно сократить количество ICO файлов в ресурсах C++ проекта.
К вопросу об использовании ico-файлов. Тут все просто - читаем статью Использование ресурсной dll для CUIx с прозрачными растрами. Скажу честно - я пока подобным не игрался, но поверю Диме.
===
Добавлено:
Цитата из статьи по поводу подключения ico-файлов:
Достаточно просто добавить новый ico-ресурс при помощи редактора Visual Studio и отредактировать свойства “ICO” ресурса в “RCDATA” как показано ниже:
Автор:
Загрузка и выгрузка приложений; задание набора приложений для автозагрузки.
ЗАГПРИЛ (команда) найти
Окно служит для загрузки и выгрузки приложений, а также для задания набора приложений для автозагрузки.
Список параметров
Параметры в верхней части этого диалогового окна извлекаются из стандартного диалогового окна выбора файлов. Ниже приведены описания параметров, которые можно найти только в диалоговом окне "Загрузка/выгрузка приложений".
Загрузка или обновление приложений, выделенных в списке файлов на вкладках "Загруженные приложения" или "Журнал". Кнопка недоступна до тех пор, пока не будет выбрано хотя бы одно приложение. Приложения ObjectARX, VBA и DBX загружаются немедленно; приложения LSP, VLX и FAS ставятся в очередь и загружаются после закрытия диалогового окна "Загрузка/выгрузка приложений".
Если выбранный файл уже загружен, нажатие кнопки ведет к его обновлению в памяти. Для приложений ObjectARX, однако, такое обновление не разрешено. Их нужно выгружать из памяти, и затем загружать заново. Параметр "Загрузить" имеется также в контекстном меню, которое вызывается щелчком правой кнопки мыши на вкладке "Журнал".
Вкладка содержит список загруженных приложений. Список упорядочен по алфавиту (по именам файлов). LISP-программы присутствуют в списке, только если они были загружены с помощью диалогового окна "Загрузка/выгрузка приложений".
Файлы можно перетаскивать в этот список из списка файлов или из какого-либо приложения, поддерживающего перетаскивание, например из Проводника Microsoft ® Windows ® или из Проводника.
Если приложение было загружено с помощью используемого в AutoCAD обозревателя Интернета, оно вначале попадает в папку для временных файлов на локальном диске. AutoCAD запускает приложение именно из этой папки, и именно эта папка будет указана в списке загрузки.
Некоторые приложения из списка на данной вкладке могут быть выгружены пользователем. Подробности см. в описание кнопки "Выгрузить". Имена файлов, которые не могут быть выгружены, отображаются тусклым шрифтом и не могут быть выделены.
Данная вкладка содержит список приложений, которые загружались при установленном флажке "Добавить в журнал". Если в момент перетаскивания флажок "Добавить в журнал" опущен, файлы загружаются в память, но в журнале не появляются.
Чтобы добавить файлы, из можно перетащить из списка файлов или из другого приложения. Приложения могут добавляться в список журнала и исключаться из него, но их выгрузка осуществляется только на вкладке "Загруженные приложения".
Добавить в журнал
Если флажок установлен, записи обо всех загружаемых приложениях добавляются в журнал.
Пользователь может предпочесть очистить этот параметр при загрузке приложений с помощью веб-браузера, так как эти приложения становятся недоступны после очистки кэша временного местоположения приложения.
Выгружает выбранные приложения или исключает их из списка журнала. Кнопка "Выгрузить" становится доступной, только если на вкладке "Загруженные приложения" выделен какой-либо файл. Кнопка "Исключить" становится доступной, только если на вкладке "Журнал" выделен какой-либо файл.
Прим.: Команда "Исключить" не выгружает выбранное приложение. Опция "Исключить" имеется также в контекстном меню вкладки "Журнал".
Указание пользовательских приложений, загружаемых при каждом запуске программы.
Прим.: Начиная с программных продуктов на основе AutoCAD 2014, пользовательские приложения, добавленные в список автозагрузки, должны находиться в доверенном расположении. Доверенные расположения определяются системной переменной TRUSTEDPATHS.
Отображает диалоговое окно "Автозагрузка".
Чтобы добавить файлы в список автозагрузки, можно также щелкнуть правой кнопкой мыши имя приложения на вкладке "Журнал" и выбрать в контекстном меню пункт "Добавить в список автозагрузки". Кроме того, можно воспользоваться функцией перетаскивания файла из списка файлов на изображение в списке автозагрузки.
Способ загрузки с помощью команды NetLoad в курсе. Через лисп (command "netload" "путь к файлу dll") неудобен, по причине того, что надо прописывать путь к файлу dll.
создаёшь кнопку как обычно, и вешаешь на неё команду _netload. При нажатии на кнопку в открывшемся диалоговом окне указываешь нужную библиотеку. Или ты хочешь конкретную библиотеку загружать по клику на кнопке?
создаёшь кнопку как обычно, и вешаешь на неё команду _netload. При нажатии на кнопку в открывшемся диалоговом окне указываешь нужную библиотеку. Или ты хочешь конкретную библиотеку загружать по клику на кнопке?
Нет, чтобы жмакнул на кнопку и сразу был результат выполнения программы, без вывода диал. окна с предоставлением возможности загрузки сборки.
Типа такого сопособа:
^C^C(command "netload" "c://myproject.dll");doEnyThing;
Но без указания пути к сборке.
Аналогия с загруской лисп приложений:
^C^C(load "myprog.lsp");myProg;
Указывать не надо путь, т.к. достаточно разместить файл с программой в папке, к которой есть доступ у AutoCAD.
Нет, чтобы жмакнул на кнопку и сразу был результат выполнения программы, без вывода диал. окна с предоставлением возможности загрузки сборки.
Типа такого сопособа:
^C^C(command "netload" "c://myproject.dll");doEnyThing;
Но без указания пути к сборке.
Аналогия с загруской лисп приложений:
^C^C(load "myprog.lsp");myProg;
Указывать не надо путь, т.к. достаточно разместить файл с программой в папке, к которой есть доступ у AutoCAD.
Ну так а проблема в чём? Добавь в каталог поиска путь к той директории, в которой у тебя хранятся .net-библиотеки и можно не указывать полный путь. В этом каталоге каждый плагин у меня имеет свой подкаталог. Вызывать его загрузку и выполнение команды, определённой в нём можно к примеру так:
^C^C(command "_netload" "textgost/AcadCommands.dll");hwd.dt;
Как видишь, общий путь я не указываю. Указываю лишь имя подкаталога плагина, дабы под каждый плагин не добавлять в профиль новый каталог поиска.
Четыре типа плагинов - четыре базовых каталога:
В диалоговом окне Options, на вкладке Files добавил путь "//aaa/bbb/ccc/ddd/eee/AcadLibs" и установил его первой строчкой.
Однако получаю две проблемы:
1. Не происходит автоматической загрузки файла Acaddoc.lsp, несмотря на то, что каталог поиска добавлен.
2. Не удаётся загрузить .Net библиотеку из командной строки. Даже если вручную установлю "filedia" в 0 и выполню команду netload, указав путь " //aaa/bbb/ccc/ddd/eee/AcadLibs/ AcadLayoutsCount.dll " или же " //aaa/bbb/ccc/ddd/eee/AcadLibs/ AcadLayoutsCount " (т.е. без расширения файла) - загрузки библиотеки не происходит.
--- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
через реестр я знаю как делать. но хотелось бы его не трогать. имхо лучше было бы разместить приведённый мною выше файл на серваке, добавить каждому пользователю в профиль запись с сылкой на каталог и всё. дело в том, что у разных юзеров разные версии автокада, у некоторых даже русские версии. т.о. каждому из них нужно будет в реестр свой вариант изменений производить. это не удобно.
Кроме того, не понял тогда офиц. инфы. смысл тогда делать вариант команды netload строчный, если он не работает?
Если я каждому юзеру пришлю эту информацию:
Создаём reg-файл, который произведет в реестре нужные изменения, решив вопрос со своевременным подключением библиотеки:
Текст нашего reg-файла:
Для русской версии AutoCAD 2009:
Для английской версии AutoCAD 2009:
[HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R17.2\ACAD-7001:409\Applications\Bushman] "LOADER"="C:\\AcadPlagins\\AcadLayoutsCount.dll" "LOADCTRLS"=dword:00000002 "MANAGED"=dword:00000001 |
Рассмотрим содержимого reg-файла более подробно:
" [HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R17.2\ACAD-7004:409\Applications\Bushman] " - здесь мы добавляем новую группу - "Bushman", в которой будут размещаться наши записи. Добавление группы обязательно! Она может иметь др. имя, но она должна быть!
Внимание!
Код писался и тестировался под 2009-ю версию AutoCAD. Если у вас другая версия программы, то вместо "\R17.2\ACAD-7001:409\" (или вместо "\R17.2\ACAD-7004:409\", если у вас русская версия AutoCAD) у вас будет другое содержимое. Откройте редактор реестра (комманда regedit из командной строки Windows) и пройдите по выше указанной ветви, дабы увидеть именно ваши значения. Внесите в reg-файл данное изменение.
Если вы внесли изменение, но ничего не заработало - значит наверняка вы ошиблись при подправлении reg-файла.
Убедиться в этом можно так: Если в командной строке AutoCAD вызвать команду "NETLOAD", и в появившемся диалоговом окне выбрать файл AcadLayoutsCount.dll - произойдет загрузка библиотеки. Теперь произведите любую операцию с листами, которая должна повлиять на счетчик листов. Если вы видите, что всё работает (о чём будет выводиться текстовая информация в командной строке AutoCAD) - значит вы напортачили при правке reg-файла. Будьте внимательней - исправьте свою ошибку.
"LOADCTRLS"=dword:00000002 - данный параметр указывает, что dll-файл необходимо загружать при открытии приложения. Значение "2" указывает на необходимость.
"MANAGED"=dword:00000001 - данный параметр указывает, что dll-файл является управляемым кодом.
"LOADER"="C:\\AcadPlagins\\AcadLayoutsCount.dll" - Данный параметр указывает полный путь к файлу нашей библиотеки (если вы сохраняете библиотеку в др. каталоге - измените эту строчку кода, указав ваш путь).
Таким образом всё, что от нас требуется - это разместить на диске "C:" каталог "AcadPlagins", в который закинуть файлы нашей сборки. После этого запустить на исполнение наш reg-файл. Всё, задача решена. Теперь можно открывать AutoCAD и работать.
Люди, прошу Вас, кто что знает, отзовитесь. Как можно подключить библиотеки программы VBA к Автокаду. Может плоско выразился, но думаю суть понятна. Буду рад любой помощи.
Суть как раз не очень понятна.
VBA не создаёт библиотек dll.
У тебя есть библиотеки написанные на VB которые ты хочешь подключить к автокаду?
Поподробнее пожалуйста.
Алекс. Я всё еще не могу понять сути проблемы.
Опиши все подробно.Что за DLL? Сделана с использованием библиотек автокада?Как связывается с автокадом?Если не хочешь писать в форум пиши на E-Mail.
Sample
macros VBA for programm "SelEdit":
Длл можно явно и неявно связывать.
В первом случае тебе понадобятся API функции: LoadLibrary(), GetProcAddress(), FreeLibrary() и, конечно, нужно будет написать свою длл для вызова функции по адресу полученному из GetProcAddress(). Вот пример такой длл:
В CallByPtr передаешь адрес функции и ее параметры.
Во втором случае (неявное связывание длл) в модуле просто указываешь прототипы функций и затем их вызываешь.
Вот вроде и все!
Да, забыл сказать: cкачай из инета MASM32 и затем запиши
код длл (см. предыдущий мой ответ) в файл, например, DllName.asm и
1) ml /c /coff DllName.asm
2) LINK.EXE /SUBSYSTEM:WINDOWS /DLL DllName.obj
И все! Длл готова! Даже не надо asm учить :)
> alex
Как подключить DLL к VBA видно из работающего примера. В остальное, думаю разберешся сам.
Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" _
(ByVal lpBuffer As String, nSize As Long) As Long
Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _
(ByVal lpBuffer As String, nSize As Long) As Long
Public Function ComputerName(Optional UserName As String) As String
'Функция возвращает имя компьютера и имя пользователя
Const gintMAX_SIZE = 100
Dim sTempString As String
Dim i As Long
Dim smsg As String
sTempString = ""
sTempString = Space$(gintMAX_SIZE)
i = gintMAX_SIZE
GetComputerName sTempString, i
ComputerName = Left$(sTempString, i)
sTempString = ""
sTempString = Space$(gintMAX_SIZE)
i = gintMAX_SIZE
GetUserName sTempString, i
UserName = Left$(sTempString, i - 1)
'smsg = "ComputerName: " & ComputerName & vbNewLine & _
' "UserName: " & UserName
'MsgBox sMsg, vbInformation
End Function
Читайте также: