|
|
|
Можно сделать подсказку по COM объектам? | ☑ | ||
|---|---|---|---|---|
|
0
TormozIT
гуру
16.04.10
✎
15:53
|
Сейчас я использую компоненту TLI.TLIApplication (метод InterfaceInfoFromObject()) для получения свойств и методов COM-объекта)
Но таким образом можно только для созданного объекта все получить, а как быть, если мне нужно "спуститься" вглубь. Есть ли какой то способ по описанию метода COM-объекта, узнать описание его возвращаемого значениия? |
|||
|
1
orefkov
16.04.10
✎
16:14
|
(0) В смысле "по описанию метода COM-объекта, узнать описание его возвращаемого значениия" - в описание метода разве не входит описание возвращаемого значения?
Или тебе надо не создавая объект узнать? |
|||
|
2
Serginio1
16.04.10
✎
17:16
|
Смотри поддержку ITypeInfo и через него смотри свойства методы параметры итд
|
|||
|
3
Serginio1
16.04.10
✎
17:26
|
||||
|
4
TormozIT
гуру
16.04.10
✎
17:41
|
(1) Объект создавать могу только корневой (типа Новый COMОбъект()), а все остальные типы внутри него как создавать то?
В общем есть текст типа П = Новый COMОбъект("HtmlFile"); П.documentElement.<Здесь я не знаю как узнать список слов> |
|||
|
5
orefkov
17.04.10
✎
08:10
|
Ну так узнаешь, что documentElement имеет тип IHTMLElement, дальше разбираешь свойства и методы этого типа.
|
|||
|
6
orefkov
17.04.10
✎
08:48
|
Вот в экселе накидал простой тест-пример, из него понятно:
Sub test() Dim tl As New tli.TLIApplication Set obj = CreateObject("htmlfile") Dim clsinfo As tli.TypeInfo Set clsinfo = tl.ClassInfoFromObject(obj) Dim mi As tli.MemberInfo Set mi = clsinfo.DefaultInterface.GetMember("documentElement") If Not mi.ReturnType.TypeInfo Is Nothing Then With mi.ReturnType.TypeInfo.Members For i = 1 To .Count Debug.Print .Item(i).Name & ", "; Next i End With End If End Sub Выдало: QueryInterface, AddRef, Release, GetTypeInfoCount, GetTypeInfo, GetIDsOfNames, Invoke, setAttribute, getAttribute, removeAttribute, className, className, id, id, tagName, parentElement, style, onhelp, onhelp, onclick, onclick, ondblclick, ondblclick, onkeydown, onkeydown, onkeyup, onkeyup, onkeypress, onkeypress, onmouseout, onmouseout, onmouseover, onmouseover, onmousemove, onmousemove, onmousedown, onmousedown, onmouseup, onmouseup, document, title, title, language, language, onselectstart, onselectstart, scrollIntoView, contains, sourceIndex, recordNumber, lang, lang, offsetLeft, offsetTop, offsetWidth, offsetHeight, offsetParent, innerHTML, innerHTML, innerText, innerText, outerHTML, outerHTML, outerText, outerText, insertAdjacentHTML, insertAdjacentText, parentTextEdit, isTextEdit, click, filters, ondragstart, ondragstart, toString, onbeforeupdate, onbeforeupdate, onafterupdate, onafterupdate, onerrorupdate, onerrorupdate, onrowexit, onrowexit, onrowenter, onrowenter, ondatasetchanged, ondatasetchanged, ondataavailable, ondataavailable, ondatasetcomplete, ondatasetcomplete, onfilterchange, onfilterchange, children, all, |
|||
|
7
orefkov
17.04.10
✎
08:50
|
+(6)
Первые 8 методов - это методы IDispatch |
|||
|
8
TormozIT
гуру
17.04.10
✎
10:36
|
(6) Спасибо! Пошел кодить подсказку.
|
|||
|
9
TormozIT
гуру
17.04.10
✎
11:15
|
А есть ли какая то общая коллекция типов COM-библиотеки?
Потому что рекурсивный проход вглубь по ReturnType может быть длинным и задавать всю цепочку как то не очень удобно для случаев, когда нужно начать сразу с конкретного типа. |
|||
|
10
TormozIT
гуру
17.04.10
✎
11:42
|
Нашел.
Если задавать путь к типу в виде <Имя COM-библиотеки>.<Имя типа> (HtmlFile.HTMLDocument). Тогда описание типа получаем так COMНавигатор.InterfaceInfoFromObject(Новый COMОбъект(<Имя COM-библиотеки>)).Parent.Interfaces.NamedItem(<Имя типа>).Members |
|||
|
11
orefkov
17.04.10
✎
11:45
|
(9)
Конечно. Когда для корневого объекта получил TypeInfo, там есть ссылка Parent на всю библиотеку, в ней есть коллекция Interfaces. Пример: Sub test() Dim tl As New TLI.TLIApplication Set obj = CreateObject("htmlfile") Dim clsinfo As TLI.TypeInfo Set clsinfo = tl.ClassInfoFromObject(obj) Dim alltypelib As TLI.TypeLibInfo Set alltypelib = clsinfo.Parent Dim deti As TLI.TypeInfo Set deti = alltypelib.Interfaces.NamedItem("IHTMLElement") With deti.Members For i = 1 To .Count Debug.Print .Item(i).Name & ", "; Next i End With End Sub Вывод: QueryInterface, AddRef, Release, GetTypeInfoCount, GetTypeInfo, GetIDsOfNames, Invoke, setAttribute, getAttribute, removeAttribute, className, className, id, id, tagName, parentElement, style, onhelp, onhelp, onclick, onclick, ondblclick, ondblclick, onkeydown, onkeydown, onkeyup, onkeyup, onkeypress, onkeypress, onmouseout, onmouseout, onmouseover, onmouseover, onmousemove, onmousemove, onmousedown, onmousedown, onmouseup, onmouseup, document, title, title, language, language, onselectstart, onselectstart, scrollIntoView, contains, sourceIndex, recordNumber, lang, lang, offsetLeft, offsetTop, offsetWidth, offsetHeight, offsetParent, innerHTML, innerHTML, innerText, innerText, outerHTML, outerHTML, outerText, outerText, insertAdjacentHTML, insertAdjacentText, parentTextEdit, isTextEdit, click, filters, ondragstart, ondragstart, toString, onbeforeupdate, onbeforeupdate, onafterupdate, onafterupdate, onerrorupdate, onerrorupdate, onrowexit, onrowexit, onrowenter, onrowenter, ondatasetchanged, ondatasetchanged, ondataavailable, ondataavailable, ondatasetcomplete, ondatasetcomplete, onfilterchange, onfilterchange, children, all, Названия часто повторяются, потому что там отдельно для PropertyPut и PropertyGet. |
|||
|
12
orefkov
17.04.10
✎
11:48
|
+(11)
Если знаешь путь к файлу с библиотекой типов или ее guid и версию, то открыть библиотеку типов можно и не создавая корневой объект, смотри TLI.TLIApplication.TypeLibInfoFromFile(FileName As String) As TypeLibInfo либо TLI.TLIApplication.TypeLibInfoFromRegistry(TypeLibGuid As String, MajorVersion As Integer, MinorVersion As Integer, LCID As Long) As TypeLibInfo |
|||
|
13
TormozIT
гуру
17.04.10
✎
12:52
|
Как отсеять все члены IDispatch?
|
|||
|
14
TormozIT
гуру
17.04.10
✎
12:56
|
Для методов, которые могут возвращать различные типы ReturnType.TypeInfo содержит Неопределено. Как получить для них список возможных возвращаемых типов?
|
|||
|
15
TormozIT
гуру
17.04.10
✎
13:04
|
Как для коллекций получить тип элемента?
|
|||
|
16
TormozIT
гуру
17.04.10
✎
13:04
|
(13) Пока отсеял через AttributeMask = 1
|
|||
|
17
TormozIT
гуру
17.04.10
✎
14:53
|
Вызываю подсказку
HtmlFile.body.<ТУТ>createTextRange() И не вижу ожидаемого метода createTextRange в списке. body в данном случае возвращает IHTMLElement. Как я понимаю, это базовый класс http://msdn.microsoft.com/en-us/library/aa752279(VS.85).aspx. А как же получить конкретный класс? |
|||
|
18
TormozIT
гуру
17.04.10
✎
16:26
|
(15) Тип элемента у коллекций описан через метод Item(), но только у однородных коллекций.
|
|||
|
19
TormozIT
гуру
17.04.10
✎
17:38
|
Как определить какую библиотеку подключать для
Новый COMОбъект("WbemScripting.SwbemLocator") ? Создать просто корневой объект Новый COMОбъект("WbemScripting") нельзя. Почему - непонимаю. |
|||
|
20
TormozIT
гуру
17.04.10
✎
17:46
|
(19) Похоже для этого предназначен метод CLSIDFromProgID, но непонятно как его вызвать из 1С.
|
|||
|
21
TormozIT
гуру
18.04.10
✎
20:21
|
Как я понял, узнать какие дополнительные интерфейсы есть у ком-объекта, можно только в рантайме и даже полный их список определить по TLB нельзя.
|
|||
|
22
orefkov
18.04.10
✎
22:30
|
(21)
Да. |
|||
|
23
artbear
19.04.10
✎
09:06
|
(19) Найти в реестре WbemScripting.SwbemLocator и посмотреть, какая библиотека там зарегистрована.
|
|||
|
24
TormozIT
гуру
19.04.10
✎
10:05
|
А коллекция CoClasses хоть какую то пользу подсказке принести может?
|
|||
|
25
orefkov
19.04.10
✎
11:29
|
(24)
Ну, особо нет. Хотя - там можно посмотреть, какие еще интерфейсы может поддерживать объект, помимо дефолтного, но как правило, толку мало, полезно, если надо посмотреть события объекта. |
|||
|
26
TormozIT
гуру
19.04.10
✎
11:58
|
(25) Я пытался "посмотреть, какие еще интерфейсы может поддерживать объект, помимо дефолтного", но не понял, как это сделать.
Итак у меня есть returnType.TypeInfo.GUID и alltypelib.CoClasses. Как понять, "какие еще интерфейсы может поддерживать объект, помимо дефолтного"? |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |