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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Подключение COM-сервера к LISP

Подключение COM-сервера к LISP

Ответ
Поиск в этой теме
Непрочитано 13.03.2011, 18:56 #1
Подключение COM-сервера к LISP
Аля_777
 
Регистрация: 13.03.2011
Сообщений: 12

Доброго времени суток!
Задача такая:необходимо написать свою функцию на делфи к автокаду.
Есть делфи-приложение,в виде COM-сервера с функцией для акада,а на лисп нужно написать функцию,котрая будет вызывать этот сом-сервер.
Пытаюсь запустить из под автокада прогу написанную на лисп,которая вроде как должна подключаться к сом-серверу и запускать его в автокаде,но она не пашет...

С лисп почти не знакома,в этом и проблема..перерыла кучу примеров,но безрезультатно,буду очень рада если кто-нибудь поможет!
Просмотров: 7700
 
Непрочитано 13.03.2011, 19:18
#2
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Во всем виновата мафия
gomer вне форума  
 
Непрочитано 13.03.2011, 19:47
#3
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Аля_777 Посмотреть сообщение
Пытаюсь запустить из под автокада прогу написанную на лисп,которая вроде как должна подключаться к сом-серверу и запускать его в автокаде,но она не пашет...
Телепатов здесь нет - больного на стол.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 13.03.2011, 20:18
#4
Аля_777


 
Регистрация: 13.03.2011
Сообщений: 12


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Телепатов здесь нет - больного на стол.
собсно,по примеру из книги "сапр на базе autocad..."


Код:
[Выделить все]
 (defun dlg-show-app-run (command_line wait / srv)
    (if (setq srv (vlax-get-or-create-object "ruMacrSvr.RunApp"))
      (progn
      (vlax-invoke-method srv "test")
       (vlax-invoke-method srv "Run" command_line
         (ru-conv-value-to-wordbool wait)
        );_end of vlax-invoke-method
      );_end of progn
(alert  "не удалось запустить")
 );_end of if
);_end of defun

 
Аля_777 вне форума  
 
Непрочитано 13.03.2011, 21:47
#5
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Есть делфи-приложение,в виде COM-сервера с функцией для акада,а на лисп нужно написать функцию,котрая будет вызывать этот сом-сервер
В COM-сервере не может быть "функций для акада". У COM-севера могут быть объекты, свойства и методы. Для возможности доступа из LISP COM должен иметь "Automation Object" выбираемый при создании "ActiveX Library" в Delphi.

Когда COM-сервер создан в DLL и зарегистрирован в системе, из LISP с ним работают примерно так, как показано в примере:

Код:
[Выделить все]
 
(defun _ru-sys-info (method_name / srv result)
;; Создаем объект сервера, обращаясь по имени
  (if (setq srv	(vlax-get-or-create-object
		  "ruSysInfo.SystemInfo"
		) 
      )
    (progn
      ;; Применяем заданный метод
      (setq result (vlax-invoke-method
		     srv
		     method_name
		   )
      )
      ;; удаляем объект
      (vlax-release-object srv)
      (setq srv nil)

    )
    (alert "Не могу запустить ruSysInfo.SystemInfo")
  ) 
  result
)
В примере показана работа с очень простым сервером, который делает доступным в LISP различную системную информацию.
Например (_ru-sys-info "GetLocalComputerName") или (_ru-sys-info "GetWindowsSystemFolder").

В более сложных случаях COM-серверу передаются параметры путем установки его свойств.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 13.03.2011, 21:56
#6
Аля_777


 
Регистрация: 13.03.2011
Сообщений: 12


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
В COM-сервере не может быть "функций для акада". У COM-севера могут быть объекты, свойства и методы.
на сом-сервере есть метод,который должен работать с объектами автокада,причем используя методы акада,разве так нельзя связывать акад и делфи?
Аля_777 вне форума  
 
Непрочитано 13.03.2011, 22:00
#7
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Аля_777 Посмотреть сообщение
на сом-сервере есть метод,который должен работать с объектами автокада,причем используя методы акада,разве так нельзя связывать акад и делфи?
Если так то можно и без COM сервера обойтись - просто exe'шник запустить - особенно если параметров передавать не нужно - то ихмо данный метод предпочтительней т.к. избавляет то необходимости регистрировать COM.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 13.03.2011, 22:07
#8
Аля_777


 
Регистрация: 13.03.2011
Сообщений: 12


ну это, конечно, можно,импортируя библиотеку типов автокада-гораздо проще,но мне хотелось бы ,например, изменить библиотечную функцию лисп,например по запуску приложения (сом-сервера)и затем работать с автокадом...
Аля_777 вне форума  
 
Непрочитано 13.03.2011, 22:20
#9
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Аля_777 Посмотреть сообщение
но мне хотелось бы ,например, изменить библиотечную функцию лисп,например по запуску приложения (сом-сервера)и затем работать с автокадом...
Чего?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 13.03.2011, 22:23
#10
Аля_777


 
Регистрация: 13.03.2011
Сообщений: 12


ну я так поняла, говоря про .ехе, вы имели ввиду вариант импорта библиотеки акада в делфи...короче,мне такой вариант не подходит=)
Аля_777 вне форума  
 
Непрочитано 13.03.2011, 22:31
#11
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Может расскроете секрет - что нужно сделать-то - если конечно это не государственная тайна - а пока у меня Ваши ответы только удивление с улыбкой вызывают (без обид).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 13.03.2011, 22:54
#12
Аля_777


 
Регистрация: 13.03.2011
Сообщений: 12


надо написать фукнцию для автокада на делфи,которая работала бы с объектами автокада. т.е. надо,работая в автокаде, выбрать объект,ну например линию, и вызвать функцию из делфи,которая расставляет определенным образом на этой линии точки. Т.е. надо связать акад и делфи,"автокад не поддерживает делфи в качестве стандарта для разработки приложений...технология Activex, внедренная в систему автокад, делает его доступным для программ,созданных в средах, использующих сом-технологии...". Чтобы связать делфи и акад существует несколько способов:
1-использование библиотеки типов (импортируем библиотеку AutoCAD в Delphi)
2-разработка приложения-сервера (как раз то,что интересует):
создаем СОМ-сервер,затем подключаем СОМ-сервер к LISP и из автокада уже можем вызывать программу лисп,которая вызывает сервер.
надеюсь,так попонятней))
Аля_777 вне форума  
 
Непрочитано 13.03.2011, 23:21
#13
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Аля_777 Посмотреть сообщение
надо написать фукнцию для автокада на делфи,которая работала бы с объектами автокада
какой из вышеуказанных способов Вы не выберите - без вызова автокадовких функций Вам не обойтись. Данная задача прекрасно решается обоими методами - либо ком - серверу передаете vla (он-же com) объект линии, либо вызываете программу которая смотрит текущий запущенный автокад - смотрит выбранную линию и используя com сервер автокада - делает с ней все что угодно. Что конкретно у Вас не получается (написать функцию, вызвать ее)?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 13.03.2011, 23:34
#14
Аля_777


 
Регистрация: 13.03.2011
Сообщений: 12


не получается вызвать ее.
ну я правильно понимаю: есть возможность вызова сом-сервера через лисп из автокада?или так лучше не делать?
p.s. причем функции на сервере надо передать некоторые значения,определяемые пользователем в интеррактивном режиме,например шаг,с которым будут расставляться точки.
Аля_777 вне форума  
 
Непрочитано 13.03.2011, 23:41
#15
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Аля_777 Посмотреть сообщение
надо написать фукнцию для автокада на делфи,которая работала бы с объектами автокада. т.е. надо,работая в автокаде, выбрать объект,ну например линию, и вызвать функцию из делфи,которая расставляет определенным образом на этой линии точки. Т.е. надо связать акад и делфи,"автокад не поддерживает делфи в качестве стандарта для разработки приложений...технология Activex, внедренная в систему автокад, делает его доступным для программ,созданных в средах, использующих сом-технологии...". Чтобы связать делфи и акад существует несколько способов:
1-использование библиотеки типов (импортируем библиотеку AutoCAD в Delphi)
2-разработка приложения-сервера (как раз то,что интересует):
создаем СОМ-сервер,затем подключаем СОМ-сервер к LISP и из автокада уже можем вызывать программу лисп,которая вызывает сервер.
надеюсь,так попонятней))
Бред! Преподов в топку... студентов на каникулы... все это решается без комов, средствами лиспа
gomer вне форума  
 
Автор темы   Непрочитано 13.03.2011, 23:49
#16
Аля_777


 
Регистрация: 13.03.2011
Сообщений: 12


Цитата:
Сообщение от gomer Посмотреть сообщение
все это решается без комов, средствами лиспа
ага,есть подобная задача,которую решают именно лиспом,но в моем случае угораздило через делфи
Аля_777 вне форума  
 
Непрочитано 14.03.2011, 00:05
#17
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Давай progid своего com-сервера, имена методов (свойств?) и аргументы которые необходимо ему передать
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 14.03.2011, 00:50
#18
Аля_777


 
Регистрация: 13.03.2011
Сообщений: 12


progid: ruMacrSrv.macros
а что касается функции,она в разработке^^ поэтому сейчас просто, тестовая:
название метода: test
параметры: a, b
результат: c
Аля_777 вне форума  
 
Непрочитано 14.03.2011, 06:43
#19
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Полная каша в голове, то ли у студентов, то ли у преподов.

Цитата:
2-разработка приложения-сервера (как раз то,что интересует):
создаем СОМ-сервер,затем подключаем СОМ-сервер к LISP и из автокада уже можем вызывать программу лисп,которая вызывает сервер.
надеюсь,так попонятней))
Зачем нужен COM-сервер, который надо подключать к LISP? Да для того, чтобы он выполнял действия, которые не умеет делать LISP своими штатными средствами. Например, в COM-сервере может быть спрятано диалоговое окно или большая "вижуальная" система для работы с БД.

Как делать COM-сервер в Delphi ("как раз то,что интересует") описано в книгах по Delphi. Как вызвать такой сервер из LISP я написал в #5.

Но такому серверу не надо ставить задачу "вызвать функцию из делфи,которая расставляет определенным образом на этой линии точки".

Delphi не умеет расставлять точки. Это умеет делать сам AutoCAD. Из программы на Delphi можно вызвать COM-сервер самого Автокада и попытаться что-то сделать его методами. Для выполнения из Delphi внутри Автокада какой-то LISP-функции имеется единственная возможность - SendCommand в командную строку. Или использовать объектные методы, но это уже не LISP.

Принципиально имеются два способа совместной работы AutoCAD и Delphi:

1. Основное приложение сделано в Delphi и, при необходимости, обращается к методам AutoCAD. Это может быть программа, которая чего-то много делает внутри себя (обычно "вижуально-гуёво"), а в AutoCAD надо сделать какую-то вспомогательныю часть. Результаты расчетов, например, нарисовать.

2. Основное приложение работает внутри AutoCAD, делает что угодно, но, при необходимости, вызывает какие-то методы из COM-сервера, сделанного на Delphi.

А у автора темы смесь ужей, ежей с добавлением проктолого-стоматологических методов лечения этой смесью.
ShaggyDoc вне форума  
 
Непрочитано 14.03.2011, 08:14
#20
Сергей Дубина


 
Регистрация: 06.04.2009
Сообщений: 702


(vlax-invoke-method (vlax-get-or-create-object "CadDSV.Starter") "TransfObj")
в acad20ххdoc.lsp должен быть (vl-load-com)
З.Ы:
Давно хотел спросить у умного народа вообще без СОМ функции *.dll запустить можно (очень хочется)?
__________________
КазнитьØнельзяØпомиловать:eek:
Сергей Дубина вне форума  
 
Непрочитано 14.03.2011, 10:01
#21
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Я не очень умный, поэтому вынужден уточнить: запустить куда?
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Непрочитано 14.03.2011, 10:34
#22
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Аля_777 Посмотреть сообщение
progid: ruMacrSrv.macros
а что касается функции,она в разработке^^ поэтому сейчас просто, тестовая:
название метода: test
параметры: a, b
результат: c
(vl-load-com)
(vlax-invoke-method (vlax-get-or-create-object "ruMacrSrv.macros") "test" a b)
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 14.03.2011, 10:41
#23
Сергей Дубина


 
Регистрация: 06.04.2009
Сообщений: 702


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Я не очень умный, поэтому вынужден уточнить: запустить куда?
Не скромничай. Не куда а откуда: из автокада, а куда она (функция) сама разберется
__________________
КазнитьØнельзяØпомиловать:eek:
Сергей Дубина вне форума  
 
Непрочитано 14.03.2011, 10:55
#24
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Это не я говорил - опять с цитатами "косячок".
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 14.03.2011, 19:44
#25
Аля_777


 
Регистрация: 13.03.2011
Сообщений: 12


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Но такому серверу не надо ставить задачу "вызвать функцию из делфи,которая расставляет определенным образом на этой линии точки".
Delphi не умеет расставлять точки. Это умеет делать сам AutoCAD.
Делфи, собстно, рассчитывает шаг,с которым будут расставляться точки,а расставлять точки,это уже по средством метода автокада...

Цитата:
Для выполнения из Delphi внутри Автокада какой-то LISP-функции...
Внутри Автокада,из делфи,должна вызываться не лисп функция,а функция которая на сервере есть...

Код:
[Выделить все]
А у автора темы смесь ужей, ежей с добавлением проктолого-стоматологических методов лечения этой смесью.
была бы рада, если бы Вы получше объяснили эту тему, а то после таких сообщений только хуже все запуталось.

Да и вообще, вопрос был не на счет функции,а на счет того,если можно,то КАК подключить сервер к лисп(изменив библиотечную функцию запуска приложения на лисп),чтобы можно было бы запускать сом-сервер и передавать параметры функции на сом-сервере из автокада
Аля_777 вне форума  
 
Непрочитано 14.03.2011, 23:13
#26
Кулик Алексей aka kpblc
Moderator

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


Попробую и я высказаться
Есть несколько вариантов решения задачи (по крайней мере мне так кажется )
Вариант 1. На Delphi (или любом другом привычном языке) пишется dll, в обязательном порядке регистрируемая в ОС. В таком случае все, что написано в dll, будет СОМ-сервером, а AutoCAD выступает в роли СОМ-клиента. СОМ-сервер не зависит от версии AutoCAD (в общем случае), т.к. не для этого он пишется
Вариант 2. На Delphi пишется некий exe-файл, который обращается к уже запущенному AutoCAD как к стороннему приложению. exe получается - СОМ-клиент, а AutoCAD - СОМ-сервер. В зависимости от выбранной схемы связывания (раннее или позднее) может понадобиться и импортирование соответствующих tlb-библиотек.
Вариант 3. Начиная с Delphi 2005, кажется, уже поддерживается .NET. Соответственно появляется возможность написать .NET-сборку, загружаемую внутрь AutoCAD (начиная с версии 2005) командой _.netload и живущую вообще по своим принципам.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.03.2011, 08:19
#27
Сергей Дубина


 
Регистрация: 06.04.2009
Сообщений: 702


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
пишется dll, в обязательном порядке регистрируемая в ОС
Это можно считать ответом на мой вопрос?
Хочется без регистрации.
__________________
КазнитьØнельзяØпомиловать:eek:
Сергей Дубина вне форума  
 
Непрочитано 15.03.2011, 08:43
#28
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


Если dll не будет зарегистрирована в ОС, то создать СОМ-объект просто не получится.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 15.03.2011, 09:59
#29
Сергей Дубина


 
Регистрация: 06.04.2009
Сообщений: 702


Цитата:
Сообщение от Лиспер Посмотреть сообщение
СОМ-объект просто не получится
В *.dll есть машинный код, СОМ-сервер ведь не сама цель. Я догадываюсь что без регистрации его нереально запустить, хотелось бы услышать это от более опытных товарищей.
__________________
КазнитьØнельзяØпомиловать:eek:
Сергей Дубина вне форума  
 
Непрочитано 15.03.2011, 10:08
#30
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Мэтры! Матёрые человечищи!
Напишите бедной девушке пример Inproc COM сервера на Delphi. Уверен, пригодится и многим другим, и мне в том числе.
Тема-то совсем не простая и лишний хорошо прокомментированный пример никогда не помешает.

Пример такой.
1. В AutoCAD запускается лисп функция, запрашивающая у пользователя отрезок, а так же число участков, на которые этот отрезок нужно разметить.
2. Если отрезок указан, вызывается метод из ком сервера и этому методу передаются координаты начала и конца отрезка.
3. Код метода обращается к объектной модели AutoCAD и строит точки на отрезке, размечая его тем самым на указанное число участков.

Т.е. ком сервер (dll) одновременно является клиентом AutoCAD'a.

Offtop: Для Сергей Дубина.
Может это то, что вы ищете?
__________________
...в шее моей жилы железные, и лоб мой - медный...

Последний раз редактировалось Pastor, 15.03.2011 в 10:30.
Pastor вне форума  
 
Непрочитано 15.03.2011, 10:25
#31
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 979


Еще один вариант, но на VB: http://www.arcada.com.ua/forum/viewtopic.php?t=460
Но я почему-то не вижу там ни картинок, ни чего бы то ни было еще
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 15.03.2011, 10:31
#32
samos


 
Регистрация: 16.06.2010
Сообщений: 43


Здравствуйте, уважаемые!
Если мой вопрос не совсем в тему, то прошу извинить.
Суть в том, что все большее число пользователей приобретают 64-х разрядные Windows.
AutoCad начиная с 2008-го устанавливается на них как 64-х разрядная версия.
Dll-ки, написанные на привычном, но старом Delphi 7 получаются 32-х разрядными.
В результате, совместно с LISP-ами они не работают. Насколько я понимаю, в одном адресном просранстве разрядность AutoCad и Dll должны совпадать.
Хотелось бы спросить у опытных программистов совета и рекомендаций по этому вопросу. Как вы решаете проблему.
samos вне форума  
 
Автор темы   Непрочитано 15.03.2011, 11:32
#33
Аля_777


 
Регистрация: 13.03.2011
Сообщений: 12


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение

Вариант 1. На Delphi (или любом другом привычном языке) пишется dll, в обязательном порядке регистрируемая в ОС. В таком случае все, что написано в dll, будет СОМ-сервером, а AutoCAD выступает в роли СОМ-клиента. СОМ-сервер не зависит от версии AutoCAD (в общем случае)...
Вот про этот вариант я и говорила.и вопрос в том,как из автокада запускать этот ком сервер (загружать форму этого сервера и передавать ему параметры ).
Пожааааалууйсто,подскажите,добрые формучане
Аля_777 вне форума  
 
Непрочитано 15.03.2011, 11:50
#34
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Аля_777 Посмотреть сообщение
Вот про этот вариант я и говорила.и вопрос в том,как из автокада запускать этот ком сервер (загружать форму этого сервера и передавать ему параметры ).
Вам это уже показывали в сообщениях № 4,5,20,22.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 15.03.2011, 12:57
#35
Сергей Дубина


 
Регистрация: 06.04.2009
Сообщений: 702


Цитата:
Сообщение от Аля_777 Посмотреть сообщение
Пожааааалууйсто,подскажите,добрые формучане
а это не смотрели?
http://dwg.ru/pub/8
__________________
КазнитьØнельзяØпомиловать:eek:
Сергей Дубина вне форума  
 
Автор темы   Непрочитано 15.03.2011, 13:04
#36
Аля_777


 
Регистрация: 13.03.2011
Сообщений: 12


Ура товарищи! все запустилось,все считается,всем большущее спасибо!

Последний раз редактировалось Аля_777, 15.03.2011 в 13:51.
Аля_777 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Подключение COM-сервера к LISP



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) Red Nova LISP 5025 20.08.2025 22:52
LISP получить список установленных в системе (векторных) шрифтов или хотя бы узнать, установлен ли указанный Ax3 LISP 9 08.02.2011 14:11
{Конкурс} Lisp. Задачки для студентов gomer LISP 10 05.01.2011 16:33
Запуск Lisp команды в новом документе BlackHarp LISP 1 26.03.2009 23:06
загрузка DOS прог через LISP Gaa LISP 15 12.08.2005 19:19