Имя: Пароль:
1C
 
Можно сделать подсказку по 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. Как понять, "какие еще интерфейсы может поддерживать объект, помимо дефолтного"?
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс