Что теоретически невозможно сделать на VB?

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

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

Ладно, забить на игру слов... Просто я под интерфейсом понимал другое, чем MSDN-овцы.
Суть-то в том, что VTable общая у всех экземпляров одного класса. А как обзывать указатели на указатели на неё - личное дело каждого.
Изображение

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

Сообщение ANDLL » 16.05.2005 (Пн) 17:05

Так что с этим:
ANDLL писал(а):2tyomitch: Ты не понял. VBA-проект использует VB-DLL. Каким образом он сможет обращаться к членам класса. Или же VB-EXE использует VB-DLL. Тот же вопрос. Он же не может определить, на каком языке написана DLL
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение GSerg » 16.05.2005 (Пн) 17:16

А зачем ему знать, на каком языке они написаны?
Зачем вообще компиляция, если после неё неважно, на чём оно было написано? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение ANDLL » 16.05.2005 (Пн) 17:56

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

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

Сообщение tyomitch » 16.05.2005 (Пн) 20:58

По информации, сохранённой внутри скомпилированного файла.
Почему ты, собственно, решил, что к методам VBA умеет обращаться, а к переменным - нет? :-?

Ещё посмотри ITypeInfo::GetVarDesc, может станет понятнее.
Изображение

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

Сообщение ANDLL » 17.05.2005 (Вт) 12:20

Гм. Темыч, стандарт COM не предусматривает открытых переменных без get/put. Т.е.: или VBA определяет, что эта либа написана на VB, и действует в обход COM, либо VBA таки использует get/put.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение tyomitch » 17.05.2005 (Вт) 18:21

ANDLL писал(а):Гм. Темыч, стандарт COM не предусматривает открытых переменных без get/put.

Неужели? А к чему тогда относится ITypeInfo::GetVarDesc :?: :?:

Чесслово, ты в PSDK хоть заглянул, прежде чем отвечать? Я же тебе конкретный метод назвал...
Изображение

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

Сообщение tyomitch » 17.05.2005 (Вт) 18:27

GSerg писал(а):Наверное, как Object which impements COM Interface :D

А что здесь такое "object"?

[бред]
Неужели никто, вводя новые понятия, не может дать им нормальных (=последовательных, систематичных) определений?
Сдаю в этом семестре Джаву: курс совместно разработан Cisco и Sun. В лекции даётся определение: "class is the blueprint for an object". Казалось бы, ничего себе метафора, но это именно их определение: в зачёте по лекции на вопрос "что такое класс" нужно отвечать именно так, и в итоговом тесте тоже. Меня не покидает ощущение, что нас принимают за телепузиков... Блин, какие чертежи внутри компа? :evil:
[/бред]
Изображение

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

Сообщение ANDLL » 17.05.2005 (Вт) 18:42

tyomitch писал(а):
ANDLL писал(а):Гм. Темыч, стандарт COM не предусматривает открытых переменных без get/put.

Неужели? А к чему тогда относится ITypeInfo::GetVarDesc :?: :?:

Чесслово, ты в PSDK хоть заглянул, прежде чем отвечать? Я же тебе конкретный метод назвал...

Вот чего не читал, того не читал... Признаю свою вину, меру, степень, глубину, что скажите все приму: ссылку, катаргу, тюрьму, но желательно в июле и желательно в Крыму.

Только вот это:
Код: Выделить всё
Public A as string
Public B as string

Public sub C()

end sub

Преобразуется в это:
Код: Выделить всё

    [
      odl,
      uuid(664BF320-AA9D-421D-A367-8D23C7BA1F8F),
      version(1.0),
      hidden,
      dual,
      nonextensible,
      oleautomation
    ]
    interface _Class1 : IDispatch {
        [id(0x40030000), propget]
        HRESULT A([out, retval] BSTR* A);
        [id(0x40030000), propput]
        HRESULT A([in] BSTR A);
        [id(0x40030001), propget]
        HRESULT B([out, retval] BSTR* B);
        [id(0x40030001), propput]
        HRESULT B([in] BSTR B);
        [id(0x60030000)]
        HRESULT C();
    };

Т.е. по правилам COM, если клиент использует интерфейс _Class1, то обращается к переменным объекта он через get/put. Или я опять ченго-то недогоняю?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение tyomitch » 17.05.2005 (Вт) 19:21

Угу, теперь найди реализацию этих методов в самом компоненте.
Я не нашёл, и сделал вывод, что их там нет :-)
К чему относятся эти записи в TLB - у меня нет никаких догадок :-/
Но явно не к методам, раз таких методов в коде нет ;-)

И посмотри-таки на ITypeInfo::GetVarDesc :!:
Изображение

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

Сообщение ANDLL » 17.05.2005 (Вт) 19:58

2tyomitch: Посмотрел, но есть подозрение, что это чисто информационная функция.
ты думаешь, что если программа, скажем на Cpp создаст экземпляр этого класса и попросит узнгать значение переменной A, то она завалится? Ведь если у этого метода нет реализации, то именно так и должно произойти.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение tyomitch » 17.05.2005 (Вт) 21:47

ANDLL писал(а):2tyomitch: Посмотрел, но есть подозрение, что это чисто информационная функция.

Вот именно. Это ответ на твой вопрос "откуда VBA знает". От информационной функции.

ANDLL писал(а):ты думаешь, что если программа, скажем на Cpp создаст экземпляр этого класса и попросит узнгать значение переменной A, то она завалится? Ведь если у этого метода нет реализации, то именно так и должно произойти.

Хз, я не пробовал :-)
А почему ты решил, что VC тупее VBA? Хотя может, какая-нибудь прога на VC4, не знающем о существовании публичных переменных, и завалится.
Изображение

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

Сообщение GSerg » 18.05.2005 (Ср) 5:01

tyomitch писал(а):А что здесь такое "object"?

Конкретно здесь должно быть что-то вроде "Сущность, инкапсулирующая в себе..." :)

tyomitch писал(а):"class is the blueprint for an object". Меня не покидает ощущение, что нас принимают за телепузиков... Блин, какие чертежи внутри компа? :evil:

Хм... А мне нравится... И в каком-то смысле это даже хорошо даёт представление о том, чем класс отличается от экземпляра класса...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение tyomitch » 18.05.2005 (Ср) 8:15

GSerg писал(а):
tyomitch писал(а):А что здесь такое "object"?

Конкретно здесь должно быть что-то вроде "Сущность, инкапсулирующая в себе..." :)

Угу. "COM-объект = сущность, инкапсулирующая в себе, которая реализует указатель на указатель на VTable." Я правильно скомбинировал три определения? :-)


ЗЫ: если бы на экзамене по математике на вопрос "что такое биссектриса" правильным ответом считалось "это крыса, которая бегает по углам", это бы тебя тоже заводило? :twisted:
Изображение

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

Сообщение ANDLL » 18.05.2005 (Ср) 13:00

Так, Темыч, надеюсь это тебя убедит:
Код: Выделить всё
   _Class1* cls;
   CLSID cls_id,int_id;
   CoInitialize(0);
   UuidFromStringW(L"FE4E036B-716A-4639-A9EF-9E1C4E7C54DF",&cls_id);
   UuidFromStringW(L"664BF320-AA9D-421D-A367-8D23C7BA1F8F",&int_id);
   CoCreateInstance(cls_id,0,CLSCTX_INPROC_SERVER,int_id,(void**)&cls);
   if(!cls)
      throw 10;
   cls->A=SysAllocString(L"AAA");
   BSTR a=cls->A;
   cls->Release();

Эта программа просто создает класс, и вызывает put и get через vtable для записи и считывания строки. Что скажешь? Что Cpp перезаписывает вызовы put/get на какие-то левые вызовы? и если ты так вершиь в магию мануал, то найди мне в них хоть какое-нибудь упоминание про возможность обращения к открытым переменным классам, избегая get/put. Ну хотя-бы оператор IDL, что бы объявить такую переменную.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Сообщение tyomitch » 18.05.2005 (Ср) 22:13

Ещё не убедило, но обещаю на днях поковыряться самому :-)
Изображение

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

Сообщение tyomitch » 20.05.2005 (Пт) 11:37

Йоп.... Так вот, оказывается, зачем из msvbvm экспортируются PutMem* - VTable ссылается прямо на эти экспорты, а не в код самого компонента.
Это, однако, не запрещает "продвинутым" клиентам узнавать о наличии публичных переменных через ITypeInfo::GetVarDesc и обращаться к ним напрямую.
Изображение

Пред.

Вернуться в Народный треп

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

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

    TopList