|
Создать дочерний класс COM объекта | ☑ | ||
---|---|---|---|---|
0
N-S-B
21.07.22
✎
18:22
|
Есть COM объект содержащий главный родительский класс и несколько дочерних. У родительского класса есть метод, который принимает в качестве параметра тип одного из дочерних классов.
То есть при создании нового COM объекта, создается объект класса ForeCourt. У класса ForeCourt есть дочерний класс PriceGroup. Так же у класса ForeCourt есть метод GetPrice, который принимает параметр с типом PriceGroup. Передается туда ссылка, которая внутри метода и заполняется: Forecourt.GetPrice(PriceGroupParam). После выполнения метода в PriceGroupParam будут данные. Проблема в том, что я не могу создать ком объект класса PriceGroup, а параметр другого типа функция не принимает и ругается на несоответствие типов. Может быть у ком объектов есть какие-то стандартные функции, с помощью которых можно получить другие классы, которые реализует ком объект? У меня есть исходник с примером работы с этим ком объектом на VB. Там ком объект подключается просто в свойствах проекта. После этого сама IDE видит все интерфейсы, классы и методы этого ком объекта. То есть я просто создаю переменную с типом PriceGroup и передаю ее в функцию GetPrice(). Как можно решить эту задачу на платформе? |
|||
1
Ryzeman
21.07.22
✎
18:26
|
(0) Стандартных нет. COM объект для 1с это посторонний класс. В них ровно то, что заложено разработчиком. Читай документацию, возможно там есть что-то вроде CreatePriceGroup
|
|||
2
Ryzeman
21.07.22
✎
18:32
|
>>Там ком объект подключается просто в свойствах проекта
Каким образом? Свойства и методы у них одинаковые, по идее ты тем же кодом можешь получить нужное тебе. |
|||
3
sitex
naïve
21.07.22
✎
19:07
|
(0) Пробовал сделать тоже самое что в VB ? Возможно, что то упускаешь.
|
|||
4
ДедМорроз
21.07.22
✎
19:26
|
В VB просто создается тип и это сразу неинициализированный Com-объект.
Если предполагается,что они создаются только так,ьо нигде,кроме VB с ними работать нельзя. |
|||
5
Мультук
гуру
21.07.22
✎
19:36
|
(1)
Я возможно глупость скажу, но раз нельзя в 1С, значит нужно на другом языке, где "можно" написать обертку (внешнюю компоненту и т.п.) и использовать ? |
|||
6
Ryzeman
21.07.22
✎
19:41
|
(5) Да нет, может используется класс, который есть в другой среде разработке как пишет (4). Но это режим Ванги, мы же не видим документацию сами
|
|||
7
ДедМорроз
21.07.22
✎
20:52
|
В любом языке,который знает,что такое TypeLib и умеет из нее создавать объекты.
|
|||
8
N-S-B
21.07.22
✎
20:57
|
(1) Документацию всю прочитал, метода или свойства, который возвращает нужный класс нет. Есть методы, которые возвращают другие классы, но конкретно этот нет.
|
|||
9
N-S-B
21.07.22
✎
20:58
|
(2) Подключается просто через References. После этого в коде я могу создать переменную с типом любого класса.
Мало того, после объявления переменной этого класса, через точку я вижу все методы и свойства этого класса. Каким образом VB это видит все? |
|||
10
N-S-B
21.07.22
✎
21:02
|
(5) Я попробовал сделать тоже самое в питоне:
import win32com.client Forecourt = win32com.client.Dispatch("PSS.Forecourt") Но точно так же Forecourt.GetPrice() ругается на несоответствие типов и как получить переменную нужного типа либо объект класса - я не нашел. Тут видимо вопрос в принципе с работой с СОМ объектом. Но опять же непонятно, как VB сразу видит все его внутренности. |
|||
11
Ryzeman
21.07.22
✎
21:11
|
(9) >>Подключается просто через References.
Ничего себе "просто" :-D https://docs.microsoft.com/ru-ru/dotnet/visual-basic/reference/command-line-compiler/reference У тебя там отдельная библиотека подключается в котором этот объект описан? |
|||
12
H A D G E H O G s
21.07.22
✎
21:13
|
(10) Скинь либу и доку или ссыль на сайт
|
|||
13
H A D G E H O G s
21.07.22
✎
21:15
|
||||
14
ДедМорроз
21.07.22
✎
21:18
|
Через Reference это и есть TypeLib соответственно,можно для Си++ сделать заголовки и внешку для 1с,если очень хочется.
|
|||
15
N-S-B
21.07.22
✎
21:27
|
(11) Ну в самой IDE это выглядит, как зайти в свойства проекта и поставить галочку напротив нужной библиотеки, которая отвечает за этот СОМ объект )
|
|||
16
N-S-B
21.07.22
✎
21:28
|
(13) Да, самой либо с доками сейчас у меня нет
|
|||
17
N-S-B
21.07.22
✎
22:04
|
(14) Мельком погуглил, нашел, что, вроде как, в 1С можно создать СОМ объект TypeLib. Это может как-то помочь?
|
|||
18
H A D G E H O G s
21.07.22
✎
22:52
|
(17) Нет. typelib - это просто помощь разработчику. COM с typelib просто будет в отладчике показывать свойства com объекта, не более.
|
|||
19
H A D G E H O G s
21.07.22
✎
22:52
|
(18) В случае 1С. В других ЯП - это полноценная подсказка в disaign-time
|
|||
20
H A D G E H O G s
21.07.22
✎
22:53
|
(17) Скидывай dll на [email protected]
|
|||
21
ДедМорроз
21.07.22
✎
23:12
|
На самом деле,там объект-singletone,который используется как элемент перечисления.
Обычно,ссылки на такие элементы получаются из корневого объекта,как свойства. Дальше,нужно смотреть эту библиотеку и точно анализировать полученное значение,т.к.вполне вероятно,что оно будет всегда одно и то же. И,если сама библиотека делалась на Си++,то там просто будет элемент перечисления(enum),который внутри число,а в объект преобразуется при выходе наружу. |
|||
22
ДедМорроз
21.07.22
✎
23:19
|
И,чтобы было понятнее, ForeCount.GetPrice(Переменная) в 1с отработает не совсем,как ожидается,если так как переменные в Com-объекты передаются по значению,то есть создается копия переменной и она передается объекту,нсли он в нее запишет другое значение,то исходная переменная не изменится.
|
|||
23
ДедМорроз
21.07.22
✎
23:23
|
https://stackoverflow.com/questions/73064796/how-to-create-a-specific-com-object-class
Вот здесь описана та же проблема,но переменная-то выходная. Если класс умеет IDispatch,то вы просто передаете переменную,и вам в нее создают ваш класс. Если класс не умеет IDispatch,то там просто уепзатель на объект. То есть VbScript должен помочь. |
|||
24
N-S-B
22.07.22
✎
09:18
|
(22) В функцию как раз передается ссылка, которая внутри функции и заполняется и после выполнения функции в переменной оказывается значение.
(23) Это мой пост и есть ) |
|||
25
N-S-B
22.07.22
✎
10:56
|
(23) Хмм, описать логику работы с СОМ на VbScript, а сам VbScript вызывать из 1С - это вы имеете в виду? Интересная идея.
Попробовал, действительно VbScript видит так же все методы СОМ объекта, однако непонятно, как мне создать переменную определенного типа тут. Да, я вижу в обозревателе, что все классы доступны, но как достучаться до них? Вот я создал объект Set PSSForeCourt = CreateObject("PSS.ForeCourt"), а как мне создать объект нужного класса? |
|||
26
N-S-B
22.07.22
✎
13:36
|
(23) (25) Нет, не поможет VBS. В нескольких местах вычитал, что VBS не поддерживает TypeLib, только IDispatch
|
|||
27
ДедМорроз
22.07.22
✎
22:00
|
Метод объекта вызывается через IDispatch ?
Или делаем Export from dll ? В первом случае,мы можем передать пустую переменную,так как согласно IDispatch, любая переменная млжет быть преобразована в ссылку на объект. Если второй случай,то для нетипизированных языков работа с такой библиотекой невозможна. |
|||
28
ДедМорроз
22.07.22
✎
22:01
|
В общем,присылай библиотеку и хоть какое-то описание,тогда будет ясно,куда нужно пнуть,и что подергать.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |