|
Зачем нужны внешние компоненты Ø |
☑ | ||
|---|---|---|---|---|
|
0
eyerie
25.09.06
✎
12:41
|
А не легче ли написать произвольный COM компонент и получить доступ к его функциональности посредством оператора Новый, напрмер, вот так:
` лалалвыавыпрвы = Новый COMОбъект("TestComponentLib.TestComponent"); где "TestComponentLib.TestComponent" ProgID моего компонента... |
|||
|
1
eyerie
25.09.06
✎
12:56
|
Немного переформулирую вопрос: чем принципиально отличается загрузка внешней компоненты от создания COM объекта, если и в том и в другом случае это есть inproc COM сервера? Просто надо сейчас написать внешнюю компоненту для расширения функциональности 8.0 вот и возник вопрос.
|
|||
|
2
megalodon
25.09.06
✎
12:57
|
при ВК есть возможность в теле ВК использовать методы 1С.
|
|||
|
3
eyerie
25.09.06
✎
13:02
|
(2) 1C является сервером автоматизации и реализует IDispatch. Значит и в программном коде произвольного COM сервера я также могу использовать все доступные в режиме внешнего соединения методы и свойства 1С ...
|
|||
|
4
megalodon
25.09.06
✎
13:09
|
пробовал?
|
|||
|
5
eyerie
25.09.06
✎
13:19
|
(4) Да. Мой компонент написан на C# и без проблем работает с типами 1С посредством RunType...
Вот пример: ` connectorType = Type.GetTypeFromProgID("V8.ComConnector"); comConnector = Activator.CreateInstance(connectorType); ClassConnectionString connString = new ClassConnectionString(); string connStringCOM = connString.ConnectionString; connection = connectorType.InvokeMember("connect", System.Reflection.BindingFlags.InvokeMethod, null, comConnector, new object[] { connStringCOM }); comConnector.GetType().InvokeMember("НачатьТранзакцию", BindingFlags.InvokeMethod, null, connection, null); |
|||
|
6
megalodon
25.09.06
✎
13:26
|
ну здесь вроде бы создается еще один экземпляр 1С-ки. Или я ошибаюсь?
|
|||
|
7
eyerie
25.09.06
✎
13:35
|
(6)Нет, здесь мы имеем дело с классическим внутрипроцессорным COM сервером (1CV8 COM Connector Type Library).
|
|||
|
8
megalodon
25.09.06
✎
13:38
|
(7) я таких умных слов не знаю честно говоря. Эта твоя конструкция в монопольном режиме сработает?
|
|||
|
9
eyerie
25.09.06
✎
13:46
|
(8)Нет, не в монопольном. Просто устанавливаю соединение когда нужно.
|
|||
|
10
megalodon
25.09.06
✎
13:48
|
(9) ВК должна работать в любом режиме.
|
|||
|
11
eyerie
25.09.06
✎
13:58
|
(10) Вызов методов 1С во внешней компоненте осуществляется также, как и у меня - серез указатель на IDispatch. Просто у меня управляемая версия.
|
|||
|
12
Gloom
25.09.06
✎
14:04
|
(11)Просто у тебя немножко каша в голове...
|
|||
|
13
eyerie
25.09.06
✎
14:11
|
(12) Если не трудно, объясни...
|
|||
|
14
eyerie
25.09.06
✎
14:18
|
13+ То есть я утверждаю, что и в том и в другом случае - это внутрипроцессорные COM сервера. Это верно?
|
|||
|
15
eyerie
25.09.06
✎
14:25
|
(12) Сказав А неплохо бы сказать и Б...
|
|||
|
16
Gloom
25.09.06
✎
14:30
|
Внешняя компонента – программный модуль, расширяющий функциональность 1С:Предприятия. Внешние компоненты являются COM-серверами и вследствие этого могут быть написаны с использованием произвольных инструментов разработки программ, поддерживающих создание COM-объектов.
Возможности внешней компоненты: расширение встроенного языка 1С:Предприятия (добавление новых агрегатных объектов); добавление страницы свойств в параметры 1С:Предприятия; сохранение параметров внешней компоненты через механизмы сохранения параметров 1С:Предприятия; создание дополнительных окон в окне 1С:Предприятия (версия 2.0, только для 1С:Предприятия 7.7); доступ к функциям 1С:Предприятия через OLE Automation (версия 2.0); вызов процедуры обработки событий, контролируемых внешней компонентой; доступ к строке состояния 1С:Предприятия. |
|||
|
17
megalodon
25.09.06
✎
14:30
|
Главное тут не то что это, возможно "внутрипроцессорные COM сервера", а то, что в твоем случае СОМ объект работает не с твоим экземпляром 1С, а создает другой, со всеми вытекающими отсюда последствиями, главное из которых - работа ведется не через то же соединение с сервером базы данных, что при использовании обычной ВК, а через другое.
|
|||
|
18
eyerie
25.09.06
✎
14:41
|
(16) Это все так и достигается это путем реализации определенных интерфейсов. Но ничто не мешает мне создать COM сервер, реализовать в нем те интерфейсы, которые дожна реализовывать ВК, зарегистрировать ProgID и загрузить мой COM сервер с помощью оператора Новый. В чем разница между оператором Новый и ЗагрузитьВнешнююКомпоненту, вот в чем вопрос.
|
|||
|
19
eyerie
26.09.06
✎
13:53
|
Апну разок. Мож кто подскажет, зачем все же нужны внешние компоненты в 8.0, если там есть режим COM соединения?
|
|||
|
20
АЛьФ
26.09.06
✎
13:59
|
2(18) "ничто не мешает мне создать COM сервер, реализовать в нем те интерфейсы, которые дожна реализовывать ВК, зарегистрировать ProgID и загрузить мой COM сервер с помощью оператора Новый" - дык, это ж и получится самая натуральная ВК :)
|
|||
|
21
eyerie
26.09.06
✎
14:04
|
(20) Так вот вопрос собственно в этом: зачем тогда нужен механизм ВК в 8.0?
Может я чего не понимаю... |
|||
|
22
Lew50
27.09.06
✎
10:12
|
(21) Наверное не все такие умные
|
|||
|
23
АЛьФ
27.09.06
✎
10:15
|
2(21) так затем и нужен, чтобы ты мог проделывать что-то типа (18). Не было бы его, и не получилось бы у тебя ничего подобного.
На самом деле, скорее всего, большенство функционала ВК просто оставлено для совместимости с 7.7. Хотя кому она нужна - х.з. |
|||
|
24
eyerie
27.09.06
✎
10:22
|
(23) В общем я уже написал нужный мне COM сервер не так, как того требует ВК, а так, как я хочу. При загрузке в 8.0 все отлично работает, весь открытый сектор доступен. Посмотрим что дальше будет, но ВК мне пока не потребовалась...
|
|||
|
25
Hadgehogs
27.09.06
✎
10:32
|
(eyerie)Вопрос у меня к вам такой, раз такая бурная дисскусия:
"Подключил я COM-сервер (выполненный в DLL) к 1С8.0, выполнил, что хотел, а как его отключить?" По идее теперь код библиотеки находится среди кода 1С8.0, ведь так? Библиотека простейшая, в Дельфи... Нашел автоматически созданные Дельфями методы Connect() и Disconnect() в объекте, из 1С8.0 вызываются, но ничего не происходит. Как быть? |
|||
|
26
eyerie
27.09.06
✎
10:46
|
(25) Ну вообще - то дискуссия не бурная :))
По поводу вопроса. COM объект САМ выгружает себя из памяти как только количество ссылок на него станет равным нулю. За вызов метода Release отвечает клиент COM объекта. |
|||
|
27
eyerie
27.09.06
✎
10:59
|
(25)<< идее теперь код библиотеки находится среди кода 1С8.0, ведь так
Совершенно верно, при загрузке inproc сервера код dll проецируется на адресное пространство вызывающего процесса, то есть 1cv8.exe. А дальше все намного интереснее. dll реализует некие интерфейсы, но все они наследованы от IUnknown, который содержит три метода, в том числе и Release. Соответственно класс, реализующий пользовательские интерфейсы должен иметь и реализацию метода Release. А вот как вызвать этот метод из клиентского кода - тут у каждого языка программирования есть свои особенности. Ищи как это делается в дельфи. Я, честно говоря, не знаю... Сам я на плюсах пишу и на шарпе. |
|||
|
28
Hadgehogs
27.09.06
✎
11:03
|
Буду глядеть...
Thanks... |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |