Перечисление свойств и методом СОM объекта

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Перечисление свойств и методом СОM объекта

Сообщение GM » 28.02.2005 (Пн) 23:23

Есть у меня Command1. Мне нужно перечислить все свойства и методы которые он имеет. Например Caption, Default, Enabled, Move,Refresh ... Как понимаю тут нужно юзать IDispatch, так как именно он содержит эту инфу. Так как VB напрямую не поддерживает использование этого интерфейса, то как можна узнать их другим путем?
الفيجوال بيسك الرابح

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.03.2005 (Вт) 4:49

Изображение

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 01.03.2005 (Вт) 6:34

Спасибо щас посмотрю.
الفيجوال بيسك الرابح

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 03.03.2005 (Чт) 1:21

А как это можно применить к VB объектам?
Например VB.CommadButton'у.
الفيجوال بيسك الرابح

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 03.03.2005 (Чт) 6:43

В самом первом примере, который http://bbs.vbstreets.ru/viewtopic.php?p=55702#55702 , напиши в начале: Set o = Command1.
Изображение

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 03.03.2005 (Чт) 14:32

Понятно, а я то перевел весь твой код тот что в tlbbrowse,в модуль, написал свой Object Browser(визуальный), а он для VB.* не пашет.
الفيجوال بيسك الرابح

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 03.03.2005 (Чт) 16:20

GM писал(а):Понятно, а я то перевел весь твой код тот что в tlbbrowse,в модуль, написал свой Object Browser(визуальный), а он для VB.* не пашет.
Это потому, что классы VB.* не зарегистрированы в реестре. Например, нельзя написать CreateObject ("VB.CommandButton")

Визуальный ObjectBrowser - дашь посмотреть? Я начинал писать свой, но быстро сдался...
Изображение

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 03.03.2005 (Чт) 20:40

Хорошо завтра скину.
الفيجوال بيسك الرابح

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 03.03.2005 (Чт) 20:47

Тут еще один вопрос. У меня есть некий объект и он в VB представлен как MSComctlLib.ImageList .
Как мне узнать progid этого объекта?
Нужно для того чтобы динамически создавать на форме ActiveX объекты.
الفيجوال بيسك الرابح

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 04.03.2005 (Пт) 2:33

Тёмыч как я и обещал мой Object Browser.
Кстати тут возникали некоторые проблемы, например при выборе Windows Script Host Network,
в CoClass Typekind = Interface, а не Coclass, я чуть изменил там код, но не думаю что оно правильно будет работать.
Вложения
gAO.rar
gAdvanced Object Manager
(11.88 Кб) Скачиваний: 175
الفيجوال بيسك الرابح

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 04.03.2005 (Пт) 9:07

GM писал(а):Тёмыч как я и обещал мой Object Browser.


Ты бы уж и заодно и Edanmo's OLE interfaces & functions v1.810 (unofficial build) выложил. А то без него и не посмотришь.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.03.2005 (Пт) 9:39

Andrey Fedorov писал(а):
GM писал(а):Тёмыч как я и обещал мой Object Browser.


Ты бы уж и заодно и Edanmo's OLE interfaces & functions v1.810 (unofficial build) выложил. А то без него и не посмотришь.
Это мой unofficial build ;-)
А выложен он в http://bbs.vbstreets.ru/download.php?id=1041
Изображение

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 04.03.2005 (Пт) 10:25

Ну а mdlObjectInfo.bas где?
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.03.2005 (Пт) 11:22

Andrey Fedorov писал(а):Ну а mdlObjectInfo.bas где?

Как где? В архиве у GM :roll:
Просто нужно либо стереть у него расширение .bas, либо исправить .vbp-файл.
Изображение

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 04.03.2005 (Пт) 14:45

Я уже спрашивал, никто не знает как достать progid объекта если он представлен в VB например MSComctlLib.ImageList?
Насчет архива, то я vbp правил вручную, вот и ошибся.
الفيجوال بيسك الرابح

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.03.2005 (Пт) 19:17

У него-то, очевидно, MSComctlLib.ImageListCtrl :-)
А вот как в общем случае - не знаю :-(
Сейчас попробую с ProgIDFromCLSID, может даст.

[edit]Дало! Вопрос решён? :-)[/edit]
Изображение

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 04.03.2005 (Пт) 20:04

Как я понял нужно CLSIDFromString, дальше ProgIDFromCLSID:
Вот что я писал:
С помощью Ole библиотеки
Код: Выделить всё
Dim a As UUID
Call CLSIDFromString("ComctlLib.ListView", a)
mvarClass = ProgIDFromCLSID(a)

Без
Код: Выделить всё
Private Declare Sub ProgIDFromCLSID Lib "ole32.dll" (ByVal clsid As Long, ByVal lplpszProgID As String)
Private Declare Sub CLSIDFromString Lib "ole32.dll" (ByVal lpsz As String, ByVal pclsid As Long)

Dim s As String
s = String(255, vbNullChar)
Call CLSIDFromString("MSComctlLib.ImageList", a)
Call ProgIDFromCLSID(a, s)


Ни один вариант не работает, первый ошибка, невозможно создать объект, второй просто не работает :)

ЗЫ: добавлении Controls.Add("MSComctlLib.Treeview", ...)
возникает забавная ошибка где VB объясняет мне что вместо Library.ClassName нужно юзать Progid, и что вот для этого контрола progid = MSComctlLib.TreeCtrl.2.
الفيجوال بيسك الرابح

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.03.2005 (Пт) 20:26

Это потому, что CLSIDFromString принимает строку вида "{2C247F23-8591-11D1-B16A-00C0F0283628}", а не "ComctlLib.ListView".

У тебя, кроме строки "ComctlLib.ListView", есть ещё и имя библиотеки, так? Можешь получить её ITypeLib?
Если да, то вызовом ITypeLib::GetTypeComp, затем ITypeComp::BindType, и наконец ITypeInfo::GetTypeAttr - ты найдёшь нужный CLSID.
Изображение

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 06.03.2005 (Вс) 19:30

Тёмыч, а как получить ITypeLib зная имя библиотеки?
الفيجوال بيسك الرابح

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.03.2005 (Вс) 20:00

GM писал(а):Тёмыч, а как получить ITypeLib зная имя библиотеки?
Код: Выделить всё
LoadTypeLibEx
Изображение

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 07.03.2005 (Пн) 0:43

Вот код:
Код: Выделить всё
Dim info As olelib.ITypeLib
Set info = LoadTypeLib(dllname) ' , REGKIND_DEFAULT)
Dim tc As olelib.ITypeComp

Set tc = info.GetTypeComp()


Dim ti As olelib.ITypeInfo

Call tc.BindType(clsid, 0&, ti, tc)

Тут возникает ошибка так как info.GetTypeComp ничего не возращает.
الفيجوال بيسك الرابح

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 07.03.2005 (Пн) 22:02

Разве никто не знает почему код не работает?
الفيجوال بيسك الرابح

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.03.2005 (Пн) 23:06

GM писал(а):Разве никто не знает почему код не работает?

Проверяй.
Код: Выделить всё
Option Explicit

Sub Main()
Debug.Print GetProgID("mscomctl.ocx", "ListView")
End Sub

Private Function GetProgID(ByVal DllName As String, ByVal CoClassName As String) As String
Dim info As olelib.ITypeLib
Set info = LoadTypeLibEx(DllName, REGKIND_NONE)

Dim tc As olelib.ITypeComp
Set tc = info.GetTypeComp()

Dim ti As olelib.ITypeInfo
tc.BindType CoClassName, 0&, ti, Nothing

Dim ta As olelib.TYPEATTR, pta As Long
pta = ti.GetTypeAttr
olelib.MoveMemory ta, ByVal pta, Len(ta)
ti.ReleaseTypeAttr pta

'это нужно чисто для отладки
Dim ClsId As String
ClsId = SysAllocString(StringFromCLSID(ta.IID))
Debug.Print ClsId

GetProgID = SysAllocString(ProgIDFromCLSID(ta.IID))
End Function
Изображение

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 08.03.2005 (Вт) 7:16

Работает, спасибо.
الفيجوال بيسك الرابح


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

    TopList