| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Объекты СОМ в AutoCAD

Объекты СОМ в AutoCAD

Ответ
Поиск в этой теме
Непрочитано 16.01.2008, 14:05 #1
Объекты СОМ в AutoCAD
Supermax
 
Руководитель фирмы
 
Москва
Регистрация: 28.03.2007
Сообщений: 1,831

Я думаю, что настало время завести специальную тему по поводу использования объектов СОМ технологии.
Ссылки, описания библиотек DLL, методы, свойства и прочее. Естественно в ключе использования AutoCAD-a на язывак AutoLISP и VBA.


Первая проблема:
Объект WScript.Shell
(setq svr (vlax-get-or-create-object "WScript.Shell"))
; создаем объект
(vlax-dump-object svr T)
; читаем его свойства и методы

Код:
[Выделить все]
; IWshShell3: Shell Object Interface
; Property values:
;   CurrentDirectory = ...Indexed contents not shown...
; Methods supported:
;   Exec (2)
T
Это у меня

А это у людей
http://www.caduser.ru/cgi-bin/f1/board.cgi?t=39974nf

Код:
[Выделить все]
(defun C:TEST()
  (vl-load-com)
  (if (and
        (setq FILE (getfiled "Выберите файл для чтения" "" "csv" 16))
        (setq WS (vlax-get-or-create-object "wscript.shell"))
        )
  (vlax-invoke-method WS
    "run"
    (strcat "notepad.exe\ " FILE)
    4
    :vlax-true)
    )
  )
И это в описании
http://www.script-coding.info/WSH/WshShell.html

Библиотеки исполняемые модули вроде
wscript.exe 5.06.0000.8820
scrobj.dll 5.06.0000.8820
scrrun.dll 5.06.0000.8820
vbscript.dll 5.06.0000.8820

Но не уверен.
Кто и что скажет?

Люди! Сделайте
(vl-load-com)
(setq svr (vlax-get-or-create-object "WScript.Shell"))
(vlax-dump-object svr T)
;;; а потом
(vl-catch-all-apply '(lambda () (vlax-release-object svr)))


на своих машинах!!! Пожалуйста!!!
И скажите что видите.
Просмотров: 39441
 
Непрочитано 16.01.2008, 14:15
#2
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


AutoCAD 2007.
Вот, что я у видел:
Код:
[Выделить все]
 
Команда: (vl-load-com)
Команда: (setq svr (vlax-get-or-create-object "WScript.Shell"))
#<VLA-OBJECT IWshShell3 00223c70>
Команда: (vlax-dump-object svr T)
; IWshShell3: Shell Object Interface
; Значения свойств:
;   CurrentDirectory = ...Индексированное содержимое не выводится...
; Поддерживаемые методы:
;   Exec (2)
T
Команда: (vl-catch-all-apply '(lambda () (vlax-release-object svr)))
0
Profan вне форума  
 
Автор темы   Непрочитано 16.01.2008, 14:25
#3
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


От блин! Спасибо Profan!
Должно быть:
; IWshShell3: Shell Object Interface (тут я не уверен)
; Значения свойств:
; CurrentDirectory = ...Индексированное содержимое не выводится...
; Environment = "System"
; SpecialFolders = Путь к папке
; Поддерживаемые методы:
; ExpandEnvironmentStrings (1)
; Popup (4)
; SendKeys (1)
; Run (3)
; Exec (1)
; AppActivate (1)
; RegDelete (1)
; RegRead (1)
; RegWrite (3)
; LogEvent (3)
; CreateShortcut (1)
T

Чувствуете разницу?

Меня смущает IWshShell3
Боюсь, что объект перехватывается не той dll-кой.
Supermax вне форума  
 
Непрочитано 16.01.2008, 14:37
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,831


http://msdn2.microsoft.com/en-us/lib...3k(VS.85).aspx
http://msdn2.microsoft.com/en-us/lib...h7(VS.85).aspx
http://msdn2.microsoft.com/en-us/lib...xf(VS.85).aspx

Хотя и под VS 2005, но объект WScript не менялся, насколько я понял.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.01.2008, 14:56
#5
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


А по человечески сказать что сделать нельзя?

Такое ощущение, что WScript.Shell несколько в разных dll-ках и происходит тот кошмар, о котором гудят на форумах по скриптам. Где этот гад IWshShell3 лежит? И как его временно заткнуть?

Последний раз редактировалось Supermax, 16.01.2008 в 15:07.
Supermax вне форума  
 
Автор темы   Непрочитано 16.01.2008, 15:07
#6
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Kpblc, не молчи! У тебя на машине что?
Supermax вне форума  
 
Непрочитано 16.01.2008, 15:23
#7
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,831


AutoCAD 2005:
Код:
[Выделить все]
_$ (vlax-dump-Object (setq svr (vlax-get-or-create-object "wscript.shell")) t)
; IWshShell3: Shell Object Interface
; Property values:
;   CurrentDirectory = ...Indexed contents not shown...
; Methods supported:
;   Exec (2)
ADT 2006:
Код:
[Выделить все]
_$ (vlax-dump-Object (setq svr (vlax-get-or-create-object "wscript.shell")) t)
; IWshShell3: Shell Object Interface
; Значения свойств:
;   CurrentDirectory = ...Индексированное содержимое не выводится...
; Поддерживаемые методы:
;   Exec (2)
AutoCAD 2008:
Код:
[Выделить все]
_$ (vlax-dump-Object (setq svr (vlax-get-or-create-object "wscript.shell")) t)
; IWshShell3: Shell Object Interface
; Property values:
;   CurrentDirectory = ...Indexed contents not shown...
; Methods supported:
;   Exec (2)
Разницы лично я не вижу в дампах - ни у себя, ни у тебя.
А по ссылкам (особенно последней) можно посмотреть вообще все методы, которые существуют в WScript.Shell. Там и Run упоминается, в частности.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.01.2008, 16:07
#8
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Если на VBA написать:
Код:
[Выделить все]
Sub cr()
Dim obj As Object
Set obj = CreateObject("WScript.Shell")
obj.popup ("calc")
End Sub
То все работает!
Хотя свойства показывает, что одно и методов не наблюдает.
В реале свойств 3 см. выше.
VBA лезет не в system32, а в свою директорию
а в system 32 лежит тоже wshom.ocx если его переименовать, то создается вновь.

Слегка ошибся в названии wshom.ocx

Последний раз редактировалось Supermax, 16.01.2008 в 16:14.
Supermax вне форума  
 
Автор темы   Непрочитано 16.01.2008, 18:54
#9
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Все! И в лиспе заработало.
(setq oWsh (vlax-create-object "WScript.Shell"))
(vlax-invoke-method oWsh "Popup" "Вы точно хотите грохнуть винчестер?" "3" "Убийца винчестеров" "0")
;(шутка)

Оказывается описанное здесь:
http://www.script-coding.info/WSH/WshShell.html#3.11.
В описании метода Popup не годится для использования из под AutoLISP-а.
Исправления для этого случая выделены красным.
Синтаксис:

Popup(<Text>,<SecondsToWait>,<Title>,<Type>)

Назначение: выводит на экран модальное окно сообщения.

Параметры:

<Text> - необязательный строка, текст сообщения.
<SecondsToWait> - обязательный, (а там необязательный)число. Количество секунд, по истечении которого окно будет автоматически закрыто.
<Title> - необязательный, строка. Текст заголовка окна сообщения.
<Type> - обязательный (там тоже необязательный), число. Комбинация флагов, определяет тип кнопок и значка. Возможные значения флагов:
0 - кнопка ОК.
1 - кнопки ОК и Отмена.
2 - кнопки Стоп, Повтор, Пропустить.
3 - кнопки Да, Нет, Отмена.
4 - кнопки Да и Нет.
5 - кнопки Повтор и Отмена.
16 - значок Stop.
32 - значок Question.
48 - значок Exclamation.
64 - значок Information.
Описание: возвращает целое значение, с помощью которого можно узнать, какая кнопка быля нажата пользователем. Возможные значения:
-1 - таймаут.
1 - кнопка ОК.
2 - кнопка Отмена.
3 - кнопка Стоп.
4 - кнопка Повтор.
5 - кнопка Пропустить.
6 - кнопка Да.
7 - кнопка Нет.


Если вы хотите увидеть рядом с сообщением значек Information и при этом чтобы было Стоп, Повтор, Пропустить, то есть 2, то надо сложить 64+2 и там написать 66.
Пример:
(vlax-invoke-method oWsh "Popup" "Цена проги 100$" "3" "Прайс-лист" "66")

Последний раз редактировалось Supermax, 16.01.2008 в 19:29.
Supermax вне форума  
 
Автор темы   Непрочитано 16.01.2008, 18:58
#10
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Увы, в думпе видим фигу, а на деле и свойства все читаются (проверил) и методы работают. Более того, метод Exec имеет только один аргумент, а в думпе написано 2. Вот, какие пироги.

О последней ссылки Kpblc-a:
Это для английской версии Windows и во многом применимо только для VBA. Для лиспа, как видим из вышеописанного надо проверять всех атрибуты на обязательность и не обязательность. По другим объектам скорее всего тоже.

Последний раз редактировалось Supermax, 16.01.2008 в 19:33.
Supermax вне форума  
 
Автор темы   Непрочитано 16.01.2008, 19:36
#11
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Следующая заковыка.

ADODB.dll
----------------------------------------------------
ADODB.Connection создается
ADODB.Stream создается
ADODB.Recordset создается
ADODB.Command создается
ADODB.Field создается только после использования метода Open объекта ADODB.Recordset
ADODB.Fields создается только после использования метода Open объекта ADODB.Recordset

Последний раз редактировалось Supermax, 19.01.2008 в 16:28.
Supermax вне форума  
 
Непрочитано 16.01.2008, 19:50
#12
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Supermax Посмотреть сообщение
Следующая заковыка.

ADODB.dll
----------------------------------------------------
ADODB.Connection создается
ADODB.Stream создается
создается
ADODB.Command создается
ADODB.Field не хочет создаваться
ADODB.Fields не хочет создаваться

Я думаю, что не только мне хочется добраться до ADODB.Field. Так как это сделать?
А ты сначала открывал ADODB.Recordset??
Если открывал, то код в студию...
Елпанов Евгений вне форума  
 
Непрочитано 16.01.2008, 20:31
#13
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,831


Для работы с ADO достаточно использовать библиотеку ADOLisp (http://fleming-group.com/, да и здесь на форуме уже несколько раз мелькала). В документации по ней описывается все что только можно
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.01.2008, 11:42
#14
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Елпанов Евгений

(vl-load-com)
(setq svr (vlax-get-or-create-object "ADODB.Recordset")) ; сздаем объект
(vlax-dump-object svr T); распечатываем Dump
(vl-catch-all-apply '(lambda () (vlax-release-object svr))); освобождаем объект.

Во его свойства и методы:
Код:
[Выделить все]
; _Recordset: nil
; Property values:
;   AbsolutePage = ADODB.Recordset: Операция не допускается, если объект закрыт.
;   AbsolutePosition = ADODB.Recordset: Операция не допускается, если объект 
закрыт.
;   ActiveCommand (RO) = nil
;   ActiveConnection = nil
;   ActiveConnection (RO) = ...Indexed contents not shown...
;   BOF (RO) = ADODB.Recordset: Операция не допускается, если объект закрыт.
;   Bookmark = ADODB.Recordset: Операция не допускается, если объект закрыт.
;   CacheSize = 1
;   CursorLocation = 2
;   CursorType = 0
;   DataMember = ""
;   DataSource = #<IUnknown 05940edc>
;   EditMode (RO) = ADODB.Recordset: Операция не допускается, если объект 
закрыт.
;   EOF (RO) = ADODB.Recordset: Операция не допускается, если объект закрыт.
;   Fields (RO) = #<VLA-OBJECT Fields 05941154>
;   Filter = 0
;   Index = ""
;   LockType = 1
;   MarshalOptions = 0
;   MaxRecords = 0
;   PageCount (RO) = ADODB.Recordset: Операция не допускается, если объект 
закрыт.
;   PageSize = 10
;   Properties (RO) = #<VLA-OBJECT Properties 05941194>
;   RecordCount (RO) = ADODB.Recordset: Операция не допускается, если объект 
закрыт.
;   Sort = ""
;   Source = ""
;   Source (RO) = ...Indexed contents not shown...
;   State (RO) = 0
;   Status (RO) = ADODB.Recordset: Операция не допускается, если объект закрыт.
;   StayInSync = -1
; Methods supported:
;   AddNew (2)
;   Cancel ()
;   CancelBatch (1)
;   CancelUpdate ()
;   Clone (1)
;   Close ()
;   CompareBookmarks (2)
;   Delete (1)
;   Find (4)
;   GetRows (3)
;   GetString (5)
;   Move (2)
;   MoveFirst ()
;   MoveLast ()
;   MoveNext ()
;   MovePrevious ()
;   NextRecordset (1)
;   Open (5)
;   Requery (1)
;   Resync (2)
;   Save (2)
;   Seek (2)
;   Supports (1)
;   Update (2)
;   UpdateBatch (1)
T
Метод Open
http://www.w3schools.com/ado/met_rs_open.asp
http://translate.google.com/translat...006-40,GGLR:en

Я хотел что-нибудь открыть, да так и не решил что.

Последний раз редактировалось Supermax, 17.01.2008 в 12:58.
Supermax вне форума  
 
Непрочитано 17.01.2008, 12:12
#15
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Supermax Посмотреть сообщение
(setq svr (vlax-get-or-create-object "ADODB.Recordset")) ; открываем объект
Это называется не открываем, а создаем!
потом его необходимо открыть, передав ему все 5 аргументов...
Пока ты его не откроешь, у тебя нет выбранных данных!
Сам посуди, если ты создал объект Recordset , он же даже не знает, из какого файла тебе нужны данные.
А поле Fields - это и есть выбранные sql запросом данные из конкретной базы данных, из конкретной таблицы и отобранные конкретным фильтром...

Вот мой самый старый вариант программы, чтения базы данных. Даю именно этот вариант - в нем очень подробные коментарии по аргументам...

Код:
[Выделить все]
(defun GET_Value (column squl / ADOCONNECT ADORECORDSET FIELDS MASSIV)
                 ;|
By ElpanovEvgeniy
16.04.2004

(GET_VALUE '("Mat_id" "color") "SELECT * FROM Mat Where Mat_txt = 'Аморант'")

|;
 (vl-load-com)
;;;  Создаём объекты: (ADODB.Connection) и (ADODB.Recordset)
 (setq ADOConnect   (vlax-create-object "ADODB.Connection")
       ADORecordset (vlax-create-object "ADODB.Recordset")
 ) ;_ setq
;;;  Открываем (ADODB.Connection)
 (vlax-invoke-method ADOConnect
                     "Open"
                     (strcat "Driver={Microsoft Access Driver (*.mdb)};DBQ="
                             (getenv "tmp")
                             "\\tmp_Materials.mdb"
                     ) ;_ strcat
                     ;;UserName Password ADOConstant-adConnectUnspecified
                     "Admin"
                     ""
                     0
 ) ;_ vlax-invoke-method
;;;  Открываем (ADODB.Recordset)
;;;  Аргументы: тип курсора 1 (ADOConstant-adOpenKeyset)
;;;  режим блокировки записи 3 (ADOConstant-adLockOptimistic)
;;;  1  (ADOConstant-adCmdText)
 (vlax-invoke-method ADORecordset "Open" squl ADOConnect 1 3 1)
;;;  Запускаем цикл по условию окончания колонки
 (setq Fields (vlax-get-property ADORecordset "Fields"))
 (while (= (vlax-get-property ADORecordset "BOF")
           (vlax-get-property ADORecordset "EOF")
           :vlax-false
        ) ;_  =
  (setq
   massiv (cons
           (mapcar
            (function (lambda (x)
                       (vlax-variant-value
                        (vlax-get-property (vlax-get-property Fields "Item" x) "Value")
                       ) ;_ vlax-variant-value
                      ) ;_ lambda
            ) ;_ function
            column
           ) ;_ mapcar
           massiv
          ) ;_ cons
  ) ;_ setq
  (vlax-invoke-method ADORecordset "MoveNext")
 ) ;_ while
 ;;  Собираем мусор
 (vlax-invoke-method ADORecordset "Close")
 (vlax-invoke-method ADOConnect "Close")
 (vlax-release-object Fields)
 (vlax-release-object ADORecordset)
 (vlax-release-object ADOConnect)
 massiv
)
Кстати, я этот код уже выкладывал в сеть, много лет назад...

Последний раз редактировалось Елпанов Евгений, 30.08.2011 в 00:55.
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 17.01.2008, 12:36
#16
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Ну вот, а я думал, что тебе надо.
Это отлично, что ты выложил. Пригодится.
А почему самый старый? Самый новый что, жалко?

Поправил коментарий в посте 11
Supermax вне форума  
 
Непрочитано 17.01.2008, 13:18
#17
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Supermax Посмотреть сообщение
Ну вот, а я думал, что тебе надо.
Это отлично, что ты выложил. Пригодится.
А почему самый старый? Самый новый что, жалко?
я не любитель библиотек, у меня каждая программа стоит на своем месте и выполняет порученную задачу, самым простым способом...
Все остальные варианты еще более специализированы, к тому же, почти без комментариев..
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 17.01.2008, 14:04
#18
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Наш человек! Я тоже не любитель библиотек. Правда DLL это как бы спуск на ярус ниже. Ближе к ассемблеру. Их функции на ОС заточены и без них много не напишешь. Вон в 9-ом посте какие крутые окошки можно вызывать, а на лиспе я только одну функцию знаю - alert, которая примитив-примитивом

Пошли дальше:

CDOEX.DLL
-----------------------------------------
CDO.Addressee
CDO.Appointment
CDO.Attendee
CDO.CalendarMessage
CDO.Configuration
CDO.DropDirectory
CDO.Folder
CDO.Item
CDO.Message
CDO.NNTPEarlyConnector
CDO.NNTPFinalConnector
CDO.NNTPPostConnector
CDO.Person
CDO.SMTPConnector

Описание тут:
Collaboration Data Object http://pda.computerra.ru/index.php?a...=26296&id=7627

только для Windows 2000. Во всяком случае, у меня нет программы, работающей с этой dll-кой и устанавливаться под XP она не желает.

Вот ее описание:
Вложения
Тип файла: doc CDOEX.doc (373.0 Кб, 1450 просмотров)
Supermax вне форума  
 
Автор темы   Непрочитано 17.01.2008, 14:06
#19
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


cdonts.dll
-------------------------------------------------
CDONTS.NewMail
CDONTS.Session

Все работает, вот описание:
Вложения
Тип файла: doc cdonts.doc (86.5 Кб, 197 просмотров)
Supermax вне форума  
 
Автор темы   Непрочитано 17.01.2008, 14:09
#20
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


cdosys.dll
-----------------------------------------------
CDO.Message
CDO.DropDirectory
CDO.Configuration

CDO.DLL
-------------------------------------------------
MAPI.Session

Не рекомендую проводить эксперементы с MAPI.Session и CDO.Message с включенны интернетом и на работе с сетью. Я лчно сервак фирмы на пол часа подвесил.

Тоже работают под XP и вот их описания:
Вложения
Тип файла: doc cdosys.doc (161.5 Кб, 2828 просмотров)
Тип файла: doc CDO.doc (492.5 Кб, 907 просмотров)
Supermax вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Объекты СОМ в AutoCAD

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запуск программы из AutoCADа kminas Программирование 19 15.06.2012 13:42
AutoCAD 2005 не открывает бесплатные 3Д объекты LenkA AutoCAD 3 11.02.2009 01:52
Уже работаю в AutoCAD 2006, но нужна книжка чтобы знать все тонкости работы с 2D графикой. Unt0nich Поиск литературы, чертежей, моделей и прочих материалов 17 06.05.2008 17:58
AUTOCAD 2006 Aragorn AutoCAD 14 01.04.2005 00:55
Что нового в AutoCAD 2005 ilka_t AutoCAD 40 19.05.2004 16:48