Что нам показывает Object Browser?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Что нам показывает Object Browser?

Сообщение ger_kar » 05.11.2015 (Чт) 23:00

В idl объявлены интерфейс и класс
interface IDynamicStructure и coclass CDynamicStructure
Так вот vb'шный Object Browser интерфейс IDynamicStructure не показывает. В подсказках IDE его тоже нет. При объявлении вручную все вполне себе работает как надо. В Object Browser вместо интерфейса IDynamicStructure присутствует как бы интерфейс CDynamicStructure, если переменную объявить с этим типом, то тоже все работает, в т.ч. и подсказки в IDE. Правда с таким объявлением код выглядит не совсем "кошерно". Почему такое происходит? Ведь никакого интерфейса CDynamicStructure у меня нет и в помине.
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Что нам показывает Object Browser?

Сообщение Хакер » 06.11.2015 (Пт) 7:39

Как ты в Object Browser-е отличаешь интерфейсы от co-классов?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Что нам показывает Object Browser?

Сообщение ger_kar » 06.11.2015 (Пт) 7:55

Хакер писал(а):Как ты в Object Browser-е отличаешь интерфейсы от co-классов?
Да никак. Просто для "своего произведения" я знаю, что у меня есть что. И вот интерфейса CDynamicStructure у меня точно нет. А есть такой класс. Получается, что в данном случае Object Browser показывает co-класс. Но у этого класса есть интерфейс IDynamicStructure, но его в Object Browser никак не видно. Хотя если его объявить вручную, то все работает.
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Что нам показывает Object Browser?

Сообщение Хакер » 06.11.2015 (Пт) 10:10

Выложи TLB, покажи как выглядит вывод Object Browser-а и опиши то, каким ты предполагаешь его увидеть.

А то так можно до бесконечности выяснять.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Что нам показывает Object Browser?

Сообщение ger_kar » 06.11.2015 (Пт) 11:22

Вот код IDL
Код: Выделить всё
[
  uuid(A37099CE-E1AA-42FF-B102-53BE3346C000),
  version(0.1),
  helpstring("DynamicStructure Description of the interfaces")
]

library DynamicStructure
{
    // TLib :     // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
    importlib("stdole32.tlb");

    interface IDynamicStructure;

    [
      odl,
      uuid(B203714D-CDE5-432E-B72C-F2C4B058DF68),
      helpstring("IDynamicStructure is a dual interface with VTable/Dispatch access."),
      oleautomation,
     dual
    ]
    interface IDynamicStructure : IDispatch
    {
      [id(00000000), propget, helpstring("Элемент коллекции.")]
        HRESULT Item([in] VARIANT Index, [out, retval] VARIANT* pStructureMember);
       
      [id(0x00000001), propget, helpstring("Количество элементов коллекции.")]
        HRESULT Count([out, retval] Long* pValue);
       
      [id(0x00000003), helpstring("Добавить элемент (динамичиское свойство).")]
        HRESULT Add([in] BSTR StrKey,[in, out] VARIANT* StructureMember);
       
      [id(0xfffffffc)]
        HRESULT _NewEnum([out, retval] IUnknown** pEmunInterface);
       
      [id(0x00000004), helpstring("Удалить элемент (динамичиское свойство).")]
        HRESULT Remove([in] VARIANT Index);
      
        [id(0x00000005), helpstring("Очистить коллекцию от всех элементов.")]
        HRESULT Clear();
       
      [id(0x00000006), helpstring("Заменить элемент коллекции.")]
        HRESULT Replace([in] BSTR StrKey, [in, out] VARIANT* StructureMember);
       
      [id(0x00000007), helpstring("Сортировка элементов коллекции.")]
        HRESULT Sort([in] long Flags);
      
        [id(0x00000008), helpstring("Возвращает строку-список ключей-имен элементов коллекции.")]
        HRESULT List([out, retval] BSTR* pString);
      
      [id(0x00000009), helpstring("Проверяет наличие динамического свойства.")]
        HRESULT Property([in] BSTR StrKey, [in, out] VARIANT* StructureMember, [out, retval] BOOLEAN* RetValue);
    };

    [
      uuid(A37099CE-E1AA-42FF-B102-53BE3346C291)
    ]
    coclass CDynamicStructure
   {
        [default] interface IDynamicStructure;
    };
};


А вот что показывает Object Browser
Object Browser.png
Object Browser.png (7.73 Кб) Просмотров: 4227
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Что нам показывает Object Browser?

Сообщение Хакер » 06.11.2015 (Пт) 12:05

Это потому что он default-интерфейс.

Если бы VB показывал интерфейсы как есть (с членами — свойствами и методами), то что надо было бы показывать в качестве членов классов? Не список официально заявленных поддерживаемых интерфейсов же.

Поэтому VB для отображения как бы использует понятие «объектный тип», как некоего обобщения класса и интерфейса. Встречая класс, VB заводит новый «объектный тип», используя в качестве «начинки» начинку интерфейса, а сам интерфейс в качестве самостоятельного объектного типа не заводится и не отображается.

Если хочешь, чтобы в Object Browser интерфейс отображался всё равно, есть два решения:
  • В качестве default-интерфейса coclass-а указать другой интерфейс.
  • Переименовать IDynamicStructure в _IDynamicStructure и завести alias с _IDynamicStructure на IDynamicStructure.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Что нам показывает Object Browser?

Сообщение ger_kar » 06.11.2015 (Пт) 13:35

Хакер писал(а):Переименовать IDynamicStructure в _IDynamicStructure и завести alias с _IDynamicStructure на IDynamicStructure.
"Это только в коде IDL нужно проделать?
А Alias как завести? TypeDef _IDynamicStructure IDynamicStructure Так?
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Что нам показывает Object Browser?

Сообщение ger_kar » 06.11.2015 (Пт) 13:52

Вставил так:
Код: Выделить всё
library DynamicStructure
{
    // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
    importlib("stdole32.tlb");
   
    interface _IDynamicStructure;
   
   typedef _IDynamicStructure IDynamicStructure;
   
    [
      odl,
      uuid(B203714D-CDE5-432E-B72C-F2C4B058DF68),
      helpstring("IDynamicStructure is a dual interface with VTable/Dispatch access."),
      oleautomation,
     dual
    ]
    interface _IDynamicStructure : IDispatch

...

    [
      uuid(A37099CE-E1AA-42FF-B102-53BE3346C291)
    ]
    coclass CDynamicStructure
   {
        [default] interface _IDynamicStructure;
    };

Переименовал в 3 местах и добавил typedef _IDynamicStructure IDynamicStructure;
Скомпилировалось без ошибок, но интерфейс так и не появился.
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Что нам показывает Object Browser?

Сообщение Хакер » 06.11.2015 (Пт) 20:11

Потому что чтобы тип, провозглашённый через typedef, был виден в VB как самостоятельный тип (не важно: это алиас к простому типу вроде Long-а или Integer-а, или же алиас на интерфейс), нужно снабдить этот typedef своим uuid-ом или хотя бы атрибутом public.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Что нам показывает Object Browser?

Сообщение ger_kar » 06.11.2015 (Пт) 20:26

Ну UUID наверное не пойдет, ведь это же не сам интерфейс а Alias, будет потом VB запрашивать интерфейс с таким UUID, а его то и нет внатуре :)
А вот Public надо попробовать. Спасибо.
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Что нам показывает Object Browser?

Сообщение ger_kar » 08.11.2015 (Вс) 10:01

Попробовал добавить для Alias'а атрибут публичности ([public]) и получилась, что и интерфейс появился и класс остался, получилось как бы дублирование. Поэтому я просто переделал библиотеку и отказался от префикса "C" в наименовании CoClass'а. И все стало хорошо. Остался просто объект без дифференцирования на класс и интерфейс :)
Но есть еще вопросы по Object Browser.
Если объявлять импортируемые функции в TLB, то как различать аргументы ByRef и ByVal? Что то я в Object Browser отличий не узрел.
И если Object Browser не показывает различий, то как тогда быть?
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Что нам показывает Object Browser?

Сообщение Хакер » 08.11.2015 (Вс) 12:06

ger_kar писал(а):Попробовал добавить для Alias'а атрибут публичности ([public]) и получилась, что и интерфейс появился и класс остался, получилось как бы дублирование.

Ты же этого и добивался.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Что нам показывает Object Browser?

Сообщение ger_kar » 08.11.2015 (Вс) 12:16

Ну в принципе да, но все равно получилось как то не очень хорошо :)
Бороться и искать, найти и перепрятать

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

Re: Что нам показывает Object Browser?

Сообщение Vi » 09.11.2015 (Пн) 10:44

ger_kar писал(а):Ну в принципе да, но все равно получилось как то не очень хорошо :)

Ну ты хотел нехорошо, вот и получилось нехорошо. Нужно не выпендриваться по-микрософтски, а писать человеческое имя кокласса, тогда не придётся прибегать к ненужным ухищрениям. В принципе, VB поступает по-человечески: не показывает интерфейс по умолчанию, а вместо него показывает имя класса. Пусть твой класс и называется DynamicStructure, который реализует IDynamicStructure или как бы он там не назывался сейчас или впоследствии. Если этот класс поддерживает или будет поддерживать ещё какие интерфейсы, то они будут отдельно доступны по их имени.

Если твой дефолтный интерфейс где-то будет использован в параметрах функций, интересно посмотреть, как это будет показывать Просмотрищик и введёт ли он его в пространство имён.

Кстати, имена с подчёркиванием в начале считаются ограниченного применения без специального указания (например, _NewEnum твоего интерфейса) и автоматически скрываются Просмотрищиком. Чтобы просмотреть их, нужно включить опцию "Show hidden members".
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН


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

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

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

    TopList