VarType(IUnknown) - интересный результат...

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

VarType(IUnknown) - интересный результат...

Сообщение ANDLL » 09.09.2004 (Чт) 16:39

Почему:
Код: Выделить всё
Dim A As Collection, B As IUnknown

Private Sub Form_Load()
Set A = New Collection
Set B = A
DisplayObjectType VarType(A)
DisplayObjectType VarType(B)
End Sub

Private Sub DisplayObjectType(ByVal aType As VbVarType)
Select Case aType
Case vbDataObject
    MsgBox "DataObject"
Case vbObject
    MsgBox "Object"
Case Else
    MsgBox "Unknown type(" & aType & ")"
End Select
End Sub


На экран выводиться:
Странный VB писал(а):Object

DataObject


Вопрос не принципиальный, просто любопытство, знаете ли.

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

Сообщение GSerg » 09.09.2004 (Чт) 17:38

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

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

Сообщение ANDLL » 09.09.2004 (Чт) 18:04

Если вместо A написать CVar(A) CVar(B) результат будет тот же самый. Вот и вопрос: почему?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение Vi » 10.09.2004 (Пт) 8:40

Да потому что для Variant-a VT_UNKNOWN = 13 и VT_DISPATCH = 9. А также vbDataObject = 13 и vbObject = 9.

И если vbObject и VT_DISPATCH - синонимы, то vbDataObject и VT_UNKNOWN - нет.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

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

Сообщение ANDLL » 10.09.2004 (Пт) 14:51

И правда, интресно...
Как же так получаеться Variant в VB и VARIANT в СOM это разные вещи? Так, например vbDecimal = 14(или vbUserDefinedType), а в VARTYPE таких констант нету.
Почему тогда не выполняеться преобразование расширенного вариант в обычный? Получаеться, что VB просто облапошиваеться с определением типа объекта.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение tyomitch » 10.09.2004 (Пт) 15:31

Есть и VT_DECIMAL, и VT_RECORD, и VT_USERDEFINED - посмотри в wtypes.h
Variant и VARIANT - это всё-таки одно и то же.
Изображение

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

Сообщение ANDLL » 10.09.2004 (Пт) 15:38

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

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

Сообщение tyomitch » 10.09.2004 (Пт) 15:44

Потому что в (самом) VB единственный объект, который не поддерживает IDispatch - это DataObject, и соответственно, язык "сужает" круг значений типа VT_UNKNOWN до своих возможностей.
Грубо говоря, чтобы программисту было проще.
Главное-то, что на функциональности это никак не сказывается.
Изображение

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

Сообщение ANDLL » 10.09.2004 (Пт) 20:08

Хитро! Сам бы я не догадался. Все таки VB умеет иногда удивлять...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение ANDLL » 10.09.2004 (Пт) 20:12

Да, кстати. Тут вы же(GSerg и tyomitch) писали, что VB не обязательно поддерживает интерфейсы, производные от IDispatch. Т.е. программисты VB все-таки обшиблись: в VB могут быть интерфейсы не поддерживаяющие IDispatch и не являющимися IUnknown. Впсомните хотя бы этот мой IApplication. Его VB тоже определил бы как DataObject?? Забавно.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение GSerg » 10.09.2004 (Пт) 20:17

Ну-ка, предъявите мне фейс, который понимаем VB и который не есть IUnknown...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение tyomitch » 10.09.2004 (Пт) 21:05

ANDLL: я нарочно написал "в (самом) VB".
Понимает VB всё что угодно, но внутри него - почти всё дуальное, а остальное - чисто диспатчное.
Т.е. считается, что если программист настолько продвинутый, что использует собственные не-IDispatch интерфейсы, то он и VarType будет сравнивать с VT_UNKNOWN, а не с vbDataObject
Изображение

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

Сообщение tyomitch » 10.09.2004 (Пт) 21:10

GSerg писал(а):Ну-ка, предъявите мне фейс, который понимаем VB и который не есть IUnknown...

Хм, ну например, ANDLL-овский IApplication ;-)
Имхо вы не поняли друг друга - ANDLL говорит про сам IUnknown, а ты - про его потомки.

2ANDLL: VT_UNKNOWN означает не "объект, поддерживающий только IUnknown", а "объект, поддерживающий IUnknown и не поддерживающий IDispatch". Единственный такой объект в VB - это DataObject; но и твой IApplication был бы именно таким объектом.
Изображение

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

Сообщение GSerg » 10.09.2004 (Пт) 21:15

Тёмыч, но наличие IUnknown-то обязательно? И при наличии некоего описания (интересно какого...) VB поймёт любой абстрактный фейс?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение ANDLL » 11.09.2004 (Сб) 11:50

VB поддерживает только COM-классы. Обычных классов в VB нет в принципе - не дорос он еще(как я понимаю, в vb7 уже есть). А учитывая, что стандарт ком строго регламентирует поддержку IUnknown, то любой дрогуй i производный от чего-то друго в VB поддеоживаться не будет.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение tyomitch » 11.09.2004 (Сб) 12:52

Имхо VB не недорос, а счастливо миновал не-COM классы, где любой клиент объекта мог его уничтожить по ошибке и обломать десяток других клиентов.
COM - замечательная вещь, не нужно от него отказываться без причины.
Изображение


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

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

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

    TopList