|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
13.11.2008, 11:31 | #1 | |
AutoLISP: Определение количества экземпляров созданных COM объектов
Руководитель фирмы
Москва
Регистрация: 28.03.2007
Сообщений: 1,831
|
||
Просмотров: 3089
|
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848
|
По-моему, нереально. В лучшем случае (если СОМ-объект создает свой процесс) можно попытаться через перечисление процессов сделать. Решений такого уровня не видел (правда, и не искал особо).
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Да, решение и я не видел, хотя ссыка вроде есть.
Вот супер классный учебник. http://www.xserver.ru/computer/sreda.../6/index.shtml А теперь, что я нарыл. 1. Цитата:
http://www.rsdn.ru/article/com/COMvs.xml#E6JAC Далее, от туда же: Цитата:
Резюме. Если создать объект типа Singleton или Моникер (см. Использование моникера тут http://www.xserver.ru/computer/sreda...svc/6/32.shtml) то, можно создать нечто (уж не знаю как назвать), что создаст собственное пространство имен, например для объекта WebBrowser. То есть, каждый раз, как кто-то пытается создать экземпляр этого объекта, созданный нами Singleton-объект пропускает это через себя и присваивает новому экземпляру новое имя. Если клиент хочет получить интерфейс от конкретного экземпляра, то он обращается к Singleton-объекту, получает от него перечень имен всех экземпляров объекта, контролируемого Singleton-объектом. Клиент передает Singleton-объекту значение какого-нибудь свойства контролируемого СОМ объекта (вместе с именем естественно) и Singleton-объект перелопатив все экземпляры, находит тот, у которого значение это свойства совпадает с запросом. Клиенту возвращается указатель на интерфейс или nil, в случае необнаружения такого состояния. Когда тебе надо, к примеру, подключиться к экземпляру браузера, обрабатывающего страницу с определенного адреса, ты передаешь имя свойства LocationURL и нужный тебе адрес страницы, а Singleton-объект возвращает тебе указатель на интерфейс того экзкмпляра объекта, который занять этим делом. Естественно у экземпляра появляется два клиента. Это не запрещено в СОМ. А наличие такого диспетчера как Singleton-объект, дает решение вопроса о продолжительности жизни СОМ объекта и своевременном клацаньи счетчика ссылок. Ну и с количеством, тут и ежу понятно, можно пальцем посчитать имена. Если объект зарегистрирован как единичный - дело не меняет. Ну будет в пространстве имен одно имя, но вот если экземпляр СОМ объекта не расчитан на работу с несколькими клиентами, тогда и Singleton-объект делать незачем. Можно сделать такой Singleton-объект для СОМ объекта AutoCAD.Application и легко получать доступ к нужному Автокаду. И т.д. Последний раз редактировалось Supermax, 15.11.2008 в 13:55. |
||||
|
||||
Это дальнейшее продвижение к реализации.
http://www.rsdn.ru/article/com/comintercept.xml |
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848
|
Ээээ... А объясни, какая разница (принципиальная) между твоим вариантом и вариантом аккуратного отслеживания создания объектов внутри кода и принудительного их уничтожения?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Ничего не мешает использованию, как ты выражаешся "аккуратно" объекта WebBrowser, в качестве немодального окна. Но принципиальная разница заключается в том, что в одном случае клиент WebBrowser-а - Автокад. Он его создал и загрузил в него нужный файл, а в другом - браузер типа Опера, который запустил Автокад с аргументом нужной страницы сайта. По моему, всплывающие окна на нем и сделаны.
Потом этот WebBrowser сам может создавать новые экземпляры WebBrowser-ов и открывать в новом окне новые панели. Это очень нужная штука, но к ним нужен доступ, в частности к их событиям. Можно конечно все новые окна тоже Автокадом открывать (да скорее всего так и будет), но если сделать так, как я пытаюсь это сделать, то макрос, запущенный в Автокаде сможет подключаться к панели, которую я открыл с неизвестного адреса, но которая мне подходит. |
||||
|
||||
Есть один пример.
Вот у меня несколько мониторов и я открыл два Автокада. Руками. Как связаться одному Автокаду с текущим рисунком другого? Ведь Getobject присоединиться к текущему объекту с указанным ProgID, а текущий-то тот, из которого это вызывается, то есть к самому себе. А если я три Автокада открою? |
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848
|
Ага, а многодокументный режим придуман для кого?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Offtop: Мне мысль пришла в голову, я взял и растянул окно Автокада на два монитора. Кнопок теперь можно натулить - уйму и два документа открывать. Один на одном мониторе, другой - на другом. Правда заголовки глаз режут, зато количеством органов управления приятно радует.
|
||||
|
||||
Совершенно опухнув от изучения тонконстей маршалинга, в порядке бреда, в голову пришла мысль, а не сделать ли пул объектов типа WebBrowser?
Технология следующая: При включении компьютера, из автозагрузки, запускается процесс, формирующий внутри себя динамический пул СОМ объектов с заглушками. Точнее, при включении только один такой объект. Класс объекта заранее определен - WebBrowser, причем определенной версии. Когда какой-либо клиент, лезет в реестр, с целью создать в своем процессе СОМ WebBrowser, вместо указателя на shdocvw.dll, он получает указатель на нашу DLL, из которой загружается ему вместо объекта WebBrowser представитель, да не простой. Он если надо shdocvw.dll в этот процесс подгрузит (вдруг от туда функции клиенту понадобятся) и связь с уже созданным и ждущим своего клиента WebBrowser-ом установит. Таким образом, получается, что все клиенты, которым нужен WebBrowser, получают его из нашего процесса, через представителя-заглушку. По скольку объект был уже создан, его отдают первому клиенту и тут же создается новый поток, с новым WebBrowser-ом и его заглушкой. Основной поток нашего процесса контролирует, чтобы всегда был только один свободный WebBrowser. Ладно, сделали, что это нам дает? Разместив в основном потоке нашего процесса специальный, нами сделанный СОМ - Singleton-объект. Который создает, нечто типа пространства имен для нашего процесса и заносит в него создаваемые WebBrowser-ы. Установив с ним связь мы можем установить связь (естественно отмаршаленную) с любым из используемых WebBrowser-ов. Контролировать их события и вообще все, что нам нужно. Какие тут могут быть подводные камни? |
||||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,848
|
Скажу честно - маршалинг лично мне пока не поддался в смысле изучения.
Вопрос даже не в том, что ты в таком случае в полной мере получишь DLL Hell (вдобавок тобою же и порожденный); вопрос звучит примерно так: "А смысл?" Ты полагаешь, что в жизни понадобится только один процесс WebBrowser. А если запущено 2 (3, 4, 5...) процессов acad.exe или любых иных приложений, которые обрашаются к WebBroswer'ам? А если эти WebBrowser'ы каждому из них нужны? Возникает вопрос разделения пространств имен. И, как я понимаю, ты вернешься к тому, с чего начал.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Нет, ты не понял. Пул - динамический, то есть всегда есть только N свободных и готовых к использованию компонентов СОМ, но, как только один из них передается своему клиенту, сразу после этого запускается создание нового образца. Размер пула увеличивается еще на один процесс с СОМ внутри. Я, для начала, сказал один уже есть. Это не в смысле всего один, а в смысле минимальное количество имеющихся в резерве свободных СОМ. И пул этот, не совсем классический пул, где все СОМ создаются сразу и перераспределяются.
Любой программе, пожелавшей работать с WebBroswer, тут же будет предоставлен ее собственный экземпляр, только вот создан он будет не в процессе и потоке клиента, а в нашем процессе и нашем потоке. А пространство имен нужно, чтобы иметь возможность обращения к уже задействованному экземпляру СОМ WebBroswer. |
||||
|
||||
Представители-заглушки WebBroswer'ам не нужны. И главная версия - {8856F961-340A-11D0-A96B-00C04FD705A2}, и версия -1 - {EAB22AC3-30C1-11CF-A7EB-0000C05BAE0B} имеют ThreadingModel - Apartment, а это, цитирую вот от сюда: http://it.kgsu.ru/VC/vc_0162.html
Цитата:
|
||||
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Определение количества строительных отходов в ПОС | VitaliyP | Технология и организация строительства | 3 | 11.11.2008 17:45 |
VBA, Определение набора текущих выделенных объектов чертежа. | Vildar | Программирование | 7 | 28.07.2008 17:35 |
FILTER / фильтр | BM60 | Справочник команд | 0 | 08.07.2008 15:35 |