3 непростых(для меня) вопроса по COM.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

3 непростых(для меня) вопроса по COM.

Сообщение ANDLL » 14.08.2004 (Сб) 10:54

Мы имеем x_obj as Object(т.е. IDispatch)/
Как:
1) Узнать CLSID класса и его полное TypeName.
2) Узнать, какие интерфейсы этот класс поддерживает.
3) Имея конкретный интерфейс этого объекта(в виде лонг-переменной), узнать Длину VTABLE, и узнать, какой элемент VTABLE как называеться.

Я понимаю, вопросы может не очень четкие, и не очень простые. Ну в конце-концов подкиньте хоть ссылку на что-то похожее(о работе с VTABLE и интерфейсами)

Спасибо.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.08.2004 (Сб) 11:03

Подключи TypeLib Info в референсах.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение tyomitch » 14.08.2004 (Сб) 11:32

GSerg писал(а):Подключи TypeLib Info в референсах.

Не поможет, если он свой объект получил в рантайме откуда-то издалека.

Ответы: 1. у меня был пример, щас найду и выложу
[edit]там тоже, оказалось, было для заранее известного типа :-([/edit]
2. список - никак, можно только спрашивать по одному интерфейсу у ::QueryInterface
3. в общем случае нельзя.

Стой, подожди, у тебя IDispatch? Тогда ::GetTypeInfo.
Вот, сбацал быстренько примерчик:
Код: Выделить всё
Option Explicit

Private Sub Form_DblClick()
Dim o As Object
Set o = GetObject(, "Word.Application")
Dim disp As olelib.IDispatch, info As olelib.ITypeInfo
Set disp = o
Set info = disp.GetTypeInfo
Dim pta As Long, ta As TYPEATTR
Dim i As Long, pfd As Long, fd As FUNCDESC
pta = info.GetTypeAttr
MoveMemory ta, ByVal pta, LenB(ta)
Dim Clsid As String * 39
Debug.Assert StringFromGUID2(ta.iid, Clsid, 39) = 39
Debug.Print Clsid
For i = 0 To ta.cFuncs - 1
    Dim Name As String, Description As String
    pfd = info.GetFuncDesc(i)
    MoveMemory fd, ByVal pfd, LenB(fd)
'    Debug.Assert info.GetNames(fd.memid, Name, 1) = 1
'    Debug.Print Name
    info.GetDocumentation fd.memid, Name, Description, 0, vbNullString
    Debug.Print Name, Description
    info.ReleaseFuncDesc pfd
Next
info.ReleaseTypeAttr pta
End Sub

показывает ClsID и все методы объекта.
Ему нужна библиотека olelib.tlb от emorcillo (http://www.mvps.org/emorcillo/vb6/tlb/olelib.shtml)

И ещё, у IDispatch членов в VTABLE ровно 7, т.е. методы самого объекта (в общем случае) туда не добавляются.
Последний раз редактировалось tyomitch 14.08.2004 (Сб) 12:27, всего редактировалось 2 раз(а).

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.08.2004 (Сб) 12:02

Да всё получится. IDispatch-то поддерживается, а через него TypeLib всё вытянет, сам удивляюсь :) Если же будет ошибка несоответствия типов (long/object), то сделать GetMem4 из varptr(long) в varptr(object).
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 14.08.2004 (Сб) 12:27

2tyomitch: Спасибо. щас проверю. Впрочем, я тут тоже постарался:
Код: Выделить всё
Private Declare Function DispatchTypeInfo Lib "..\Debug\TestCOM2.dll" (ByVal x_obj As Object) As Long

Dim A As Object
Set A = CreateObject("Scripting.FileSystemObject")
DispatchTypeInfo A


И:
Код: Выделить всё
long DispatchTypeInfo(LPDISPATCH lpDisp)
{
   ITypeInfo **tpInfo;
   UINT tpCount=0,tpI;
   lpDisp->GetTypeInfoCount(&tpCount);
   tpInfo=(ITypeInfo**)(new DWORD[tpCount-1]);//Создаем массив из tpCount-1 элементов.
   //Записываем массив
   for(tpI=0;tpI<tpCount;tpI++)
   {
      lpDisp->GetTypeInfo(tpI,0,&tpInfo[tpI]);
   }
   //Чего нибудь тут делаем с этим массивом.
   //...

   //Удаляем массив
   for(tpI=0;tpI<tpCount;tpI++)
      tpInfo[tpI]->Release();
   //delete [tpCount-1](DWORD*)tpInfo; //В этой строке происходит memory exc. Почему?
   return 1;
}

(проект MFC App Wizard(DLL))

А что собственно можно делать с tpInfo? Там куча каких-то непонятных функций. Для чего они предназначены?
И еще: что такое второй параметр в ::GetTypeInfo? LCID lcid. Я оставил его 0, но что-то же он значит.
И почему происходит exc. в последней закомментированой строке?

Ну и наконец: весь указанный код ничего, в принципе, не делает, но и не вызывает exc.
Правда, если запустить VB-проект под IDE появляеться Bad DLL Conversion calling , но после сборки и эта ошибка исчезает:)
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение tyomitch » 14.08.2004 (Сб) 12:36

ANDLL писал(а):2tyomitch: Спасибо. щас проверю. Впрочем, я тут тоже постарался:

Я уже обновил пример. Мой, кстати, без внешних зависимостей ;-)
Т.е. TLB для скомпилированного проекта не нужна.

ANDLL писал(а):А что собственно можно делать с tpInfo? Там куча каких-то непонятных функций. Для чего они предназначены?
И еще: что такое второй параметр в ::GetTypeInfo? LCID lcid. Я оставил его 0, но что-то же он значит.
И почему происходит exc. в последней закомментированой строке?

Ну и наконец: весь указанный код ничего, в принципе, не делает, но и не вызывает exc.
Правда, если запустить VB-проект под IDE появляеться Bad DLL Conversion calling , но после сборки и эта ошибка исчезает:)

Начну с конца :-)
Эта ошибка означает, что неправильно объявлена вызываемая функция. В скомпилированном файле проверки целостности стека не делается, поэтому лучше её исправить. Если сообщение исчезает, то это не значит, что ошибки нет ;-)
Конкретно у тебя, похоже, DispatchTypeInfo cdecl - надо её в сишном исходнике объявить как stdcall.
Методы ITypeInfo возвращают всю мыслимую информацию о типе. В моём примере запрашиваются CLSID, имена и описания всех функций. Остальные функции возвращают остальные вещи :-)
lcid - идентификатор локали. У одной TLB (в теории) может быть несколько версий: с русскими описаниями, английскими, японякими и т.д. 0 означает "по умолчанию".
О, а вот из МСДН:
lcid
The locale identifier for the type information. An object may be able to return different type information for different languages. This is important for classes that support localized member names. For classes that do not support localized member names, this parameter can be ignored

Исключение: может быть, надо delete ((DWORD[tpCount-1])*)tpInfo; :?:
И почему там, кстати, массив размером tpCount-1? Т.е. последний элемент с индексом tpCount-2, а цикл аж до tpCount-1? Непорядок!
И зачем вообще там массив?
IDispatch::GetTypeInfoCount
Retrieves the number of type information interfaces that an object provides (either 0 or 1).

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 14.08.2004 (Сб) 12:50

Что ж. Пожалуй смысла писать C-DLL, раз можно на VB, нет. Спасибо. Пожалуй понял.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение tyomitch » 14.08.2004 (Сб) 15:49

Короче, зацепила меня эта тема не по-детски, решил свою шнягу наподобие Object Browser-а написать (кстати, никто не в курсе, - нет уже готовых Object Browser-ов на VB? :-)
Вот пример вывода: (смотрите, завидуйте!)
Код: Выделить всё
dispinterface id: {CE1B1932-509E-4BA9-8F6E-1517DB41FCA2}
dispinterface members list:
----------
Property Get _Default() As Object
(dispatch only)
Description:
_Default     
----------
Property Get Name() As String
(dispatch only)
Description:
Name          Returns the name used in code to identify an object.
----------
Property Get Caption() As String
(dispatch only)
Description:
Caption       Returns/sets the text displayed in an object's title bar or below an object's icon.
----------
Property Let Caption(RHS As String)
(dispatch only)
Description:
Caption       Returns/sets the text displayed in an object's title bar or below an object's icon.
----------
Property Get hWnd() As Long
(dispatch only)
Description:
hWnd          Returns a handle (from Microsoft Windows) to an object's window.
----------
Property Get BackColor() As Long
(dispatch only)
Description:
BackColor     Returns/sets the background color used to display text and graphics in an object.
----------
Property Let BackColor(RHS As Long)
(dispatch only)
Description:
BackColor     Returns/sets the background color used to display text and graphics in an object.
----------
Property Get ForeColor() As Long
(dispatch only)
Description:
ForeColor     Returns/sets the foreground color used to display text and graphics in an object.
----------
Property Let ForeColor(RHS As Long)
(dispatch only)
Description:
ForeColor     Returns/sets the foreground color used to display text and graphics in an object.
----------
Property Get Left() As Single
(dispatch only)
Description:
Left          Returns/sets the distance between the internal left edge of an object and the left edge of its container.
----------
Property Let Left(RHS As Single)
(dispatch only)
Description:
Left          Returns/sets the distance between the internal left edge of an object and the left edge of its container.
----------
Property Get Top() As Single
(dispatch only)
Description:
Top           Returns/sets the distance between the internal top edge of an object and the top edge of its container.
----------
Property Let Top(RHS As Single)
(dispatch only)
Description:
Top           Returns/sets the distance between the internal top edge of an object and the top edge of its container.
----------
Property Get Width() As Single
(dispatch only)
Description:
Width         Returns/sets the width of an object.
----------
Property Let Width(RHS As Single)
(dispatch only)
Description:
Width         Returns/sets the width of an object.
----------
Property Get Height() As Single
(dispatch only)
Description:
Height        Returns/sets the height of an object.
----------
Property Let Height(RHS As Single)
(dispatch only)
Description:
Height        Returns/sets the height of an object.
----------
Property Get Enabled() As Boolean
(dispatch only)
Description:
Enabled       Returns/sets a value that determines whether an object can respond to user-generated events.
----------
Property Let Enabled(RHS As Boolean)
(dispatch only)
Description:
Enabled       Returns/sets a value that determines whether an object can respond to user-generated events.
----------
Property Get WindowState() As Integer
(dispatch only)
Description:
WindowState   Returns/sets the visual state of a form window at run time.
----------
Property Let WindowState(RHS As Integer)
(dispatch only)
Description:
WindowState   Returns/sets the visual state of a form window at run time.
----------
Property Get MousePointer() As Integer
(dispatch only)
Description:
MousePointer  Returns/sets the type of mouse pointer displayed when over part of an object.
----------
Property Let MousePointer(RHS As Integer)
(dispatch only)
Description:
MousePointer  Returns/sets the type of mouse pointer displayed when over part of an object.
----------
Property Get FontName() As String
(dispatch only)
Description:
FontName      Specifies the name of the font that appears in each row for the given level.
----------
Property Let FontName(RHS As String)
(dispatch only)
Description:
FontName      Specifies the name of the font that appears in each row for the given level.
----------
Property Get FontSize() As Single
(dispatch only)
Description:
FontSize      Specifies the size (in points) of the font that appears in each row for the given level.
----------
Property Let FontSize(RHS As Single)
(dispatch only)
Description:
FontSize      Specifies the size (in points) of the font that appears in each row for the given level.
----------
Property Get FontBold() As Boolean
(dispatch only)
Description:
FontBold      Returns/sets bold font styles.
----------
Property Let FontBold(RHS As Boolean)
(dispatch only)
Description:
FontBold      Returns/sets bold font styles.
----------
Property Get FontItalic() As Boolean
(dispatch only)
Description:
FontItalic    Returns/sets italic font styles.
----------

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 14.08.2004 (Сб) 15:57

А пример кода?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.08.2004 (Сб) 16:15

Почти в тему: не знаешь, как явно указать GUID для моей ActiveX dll?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение tyomitch » 14.08.2004 (Сб) 16:25

Пример запощу, когда всё сделаю. Это ещё только реклама, типа :-)

Явно указать GUID:
1) компилируешь ActiveX DLL, копируешь в файл (условно) foobar.bin
2) извлекаешь из него ресурс TYPELIB
3) декомпилируешь его с помощью тулзы OLEView, которая есть где-то на download.microsoft.com
4) изменяешь все GUID-ы нв нужные
5) компилируешь TLB с помощью тулзы mktyplib, которая входит в Студию
6) кладёшь новый TLB обратно в foobar.bin
7) в опциях совместимости проекта выбираешь бинарную совместимость с foobar.bin

Если тебе надо задать только IID для класса, всё гораздо проще.
1) Описываешь нужный интерфейс IFooBar в foobar.idl
2) Компилируешь его в foobar.tlb
3) Добавляешь foobar.tlb в ссылки проекта
4) В начале нужного класса пишешь Implements IFooBar

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.08.2004 (Сб) 16:48

Ага... На декомпиляцию у меня PE Browse есть. Так, ну-ка...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение tyomitch » 14.08.2004 (Сб) 19:34

ANDLL писал(а):А пример кода?

Вот, готово.
Объект задаётся в начале Form_DblClick, по умолчанию там строка Set o = GetObject(, "Word.Application"), можно приписать любую другую.
Вывод в файл c:\output.log
Проверено с Scripting.FileSystemObject и Word.Application.8
С формой VB работает после твиков (вместо загрузки tlb (index = info.GetContainingTypeLib(tlb)) нужно сразу вызывать PrintDispinterface info, ta)
Использует мою собственную модификацию olelib от emorcillo.

Пример вывода:
[edit]Убран, качайте сами и смотрите[/edit]
Вложения
tlbbrwse.zip
(189.03 Кб) Скачиваний: 392
Последний раз редактировалось tyomitch 15.08.2004 (Вс) 1:05, всего редактировалось 1 раз.

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

Сообщение tyomitch » 15.08.2004 (Вс) 1:02

Короче, я усовершенствовал tlbbrwse - теперь он показывает всю информацию о классе, про которую я знаю, что она значит. Пользуйтесь!

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 15.08.2004 (Вс) 8:14

Тут GSerg что-то писал про моньяков. Не изъяснитесь ли точней?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.08.2004 (Вс) 8:31

Вообще-то это был комплимент от человека, гораздо менее разбирающегося в приведённых вопросах :)
Модеры его удалили, что ли... Ну и зачем? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение tyomitch » 15.08.2004 (Вс) 12:18

GSerg писал(а):Подключи TypeLib Info в референсах.

Кстати, я с этим делом поразбирался - там свои сложности. Во-первых, интерфейс не проще, чем у ITypeInfo, во-вторых, tlbinf32.dll является частью Студии, и её нельзя распространять. Т.е. "для внутреннего использования" решения на её основе ещё можно писать, а вот для распространения - уже нет.
Щас осталось мой пример красиво оформить и куда-нибудь пристроить :-)

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 15.08.2004 (Вс) 19:41

2tyomitch: Напиши вместо GetObject... CreateObject("Microsoft.XMLDOM"). Там получаеться два интерфейса, но эти интерфейсы описаны раз десять.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение tyomitch » 15.08.2004 (Вс) 20:29

ANDLL писал(а):2tyomitch: Напиши вместо GetObject... CreateObject("Microsoft.XMLDOM"). Там получаеться два интерфейса, но эти интерфейсы описаны раз десять.

На моей машине:
MSXML2 Microsoft XML, v3.0
LibID: {F5078F18-C551-11D3-89B9-0000F81FE221}
Version: 3.0

- в файле коклассы: Msxml2.DOMDocument, DOMDocument26, DOMDocument30, FreeThreadedDOMDocument, FreeThreadedDOMDocument26, FreeThreadedDOMDocument30.
У каждого по три интерфейса: диспинтерфейс, VTBL-bound интерфейс, и интерфейс событий.

И это правильно - все 6 коклассов поддерживают запрошенный интерфейс IXMLDOMDocument2, так что невозможно выяснить, объект какого именно класса был создан.

[edit]Оказывается, через IProvideClassInfo это возможно. Вот пример: (TLB старая):[/edit]
Вложения
Form4.zip
(3.53 Кб) Скачиваний: 234
Последний раз редактировалось tyomitch 16.08.2004 (Пн) 13:12, всего редактировалось 1 раз.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 16.08.2004 (Пн) 10:47

tyomitch писал(а):... во-вторых, tlbinf32.dll является частью Студии, и её нельзя распространять.

Ты ошибаешься: tlbinf32.dll является свободно распространяемой библиотекой. Это описано в REDIST.TXT в студии.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

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

Сообщение tyomitch » 16.08.2004 (Пн) 12:01

Vi писал(а):
tyomitch писал(а):... во-вторых, tlbinf32.dll является частью Студии, и её нельзя распространять.

Ты ошибаешься: tlbinf32.dll является свободно распространяемой библиотекой. Это описано в REDIST.TXT в студии.

Упс, сорри, меня ввели в заблуждение.
Но в любом случае, мой метод не требует тащить за собой дополнительные библиотеки и лучше уже этим.

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

Сообщение Andrey Fedorov » 16.08.2004 (Пн) 12:50

нет уже готовых Object Browser-ов на VB?


Дык они-ж довольно элементарно пишутся с использованием TLBINF32.DLL. По крайней мере я полный аналог VB-шного когда-то делал...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение tyomitch » 16.08.2004 (Пн) 13:16

Andrey Fedorov писал(а):
нет уже готовых Object Browser-ов на VB?


Дык они-ж довольно элементарно пишутся с использованием TLBINF32.DLL. По крайней мере я полный аналог VB-шного когда-то делал...

Элементарно, но долго. Я и спрашиваю, готовых-то нет? :-)

2ANDLL, про Microsoft.XMLDOM: посмотри новый пример, там только нужный кокласс печатается.

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

Сообщение Andrey Fedorov » 16.08.2004 (Пн) 13:32

Могу дать исходники одного проекта, но:

1. В нем используется GridEx
2. К нему сейчас нет одной DLL-ки. Но она не столь нужна - в ней локализация (просто на формах где-то может не быть надписей - просто сам их добавишь)...
3. Сам проект довольно-таки старый и не завершен. Но Object Browser там есть.

Но если Grid найдешь то все работать будет.
В общем, держи - приложено.
Вложения
Sample.rar
(41.62 Кб) Скачиваний: 226
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение tyomitch » 16.08.2004 (Пн) 17:24

Andrey Fedorov писал(а):Могу дать исходники одного проекта...

Большое спасибо, очень интересная вещь.

Просто интересно - а что это был за проект? В коде видно кучу всякой функциональности, которая в UI никак не отражена... Или же я в интерфейсе так и не разобрался?

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

Сообщение Andrey Fedorov » 16.08.2004 (Пн) 17:38

Да там много чего было задумано - я же говорил что проект незавершен. К примеру (насколько я помню), сопоставление двух ActiveX компонентов. Но заглохло, ибо работа перетекла на другой проект, а бесплатно продолжать разработку мне незахотелось...

Но Object Browser я там успел реализовал в полной мере и ничуть не хуже чем в VB. Так что достаточно его немножко причесать, выкинув лишнее. В частности сразу можно выкидывать Language.cls и FormLanguage.cls (ну и ссылки на них поправить) - это классы заведовавшие локализацией - я уже и не помню что там им было нужно - не все сохранил...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение tyomitch » 16.08.2004 (Пн) 18:44

Andrey Fedorov писал(а):Но Object Browser я там успел реализовал в полной мере и ничуть не хуже чем в VB. Так что достаточно его немножко причесать, выкинув лишнее.

Не в полной. Нехватает возможности загрузить несколько библиотек, чтобы переходить между ними (напр. Word и Office); группировать члены по типу; переходить к классу по подчёркнутой зелёной ссылке; поиска, хотя какая-то процедура поиска в коде есть.

Ещё претензии по функциональности есть... Например, в модуле VBA.DateTime показывается два свойства Calendar - одно ReadOnly, другое WriteOnly, и вовсе не показывается свойства Date/Date$ и Time/Time$. Псевдообъект <globals> не включает в себя функции модулей...

Одним словом, на "полную меру" не тянет. Но всё лучше, чем ничего :-)

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

Сообщение Andrey Fedorov » 17.08.2004 (Вт) 7:07

Ну уж придираться...

Надо ведь было и тебе что-то оставить сделать ;)
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


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

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

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 15

    TopList