Что делает CreateObject?

Обсуждение вопросов, касающихся указанной технологии.
SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Что делает CreateObject?

Сообщение SLIM » 03.05.2010 (Пн) 12:32

Что же делает CreateObject в VB?
Мне почему-то казалось что
1. Вызывает COM-кую функцию CoCreateInstance
2. Та вызывает экспортируемую ф-ю DllGetClassObject
3. DllGetClassObject создает компонент ClassFactory и получает указатель на интерфейс IClassFactory
4. COM вызывает у IClassFactory функцию CreateInstenc, которая создает компонент, и поучает указатель на соответствующий интерфейс

5. Потому всякое там бла бла бла по удалению ClassFactory и т.д.

Это вообще так?
Ведь для того чтобы заюзать COM-компонент из-под VB должно хватать фабрики классов. Я понимаю скриптовые языки, я может понадобитьяся IDispatch. Но здесь должно хватать.
Пишите жизнь на чистовик.....переписать не удастся.....

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

Re: Что делает CreateObject?

Сообщение Хакер » 03.05.2010 (Пн) 13:27

Ну примерно это же и делает. В чём вопрос? Не вижу вопроса.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Что делает CreateObject?

Сообщение SLIM » 03.05.2010 (Пн) 14:13

Вопрос был "это вообще так?"
Но раз это так, то возникает другой вопрос.

Почему все это может не работать? :)
Ситуация странная. InprocServer работает под C++, но не работает из-под VB. Мне говорили что нужно реализовать IDispatch, либо дуальный интерфейс, но я думаю это обман.
На сях компонент работает тоже странно. Есть пару этапов работы (при трассировке Debug-версии обнаружил), которые для меня непонятны, и, возможно, от которых глюки в VB. Этапы следующие (те же этапы что и раньше, только что в реале происходит в сях)
1. Вызов DllGetClassObject (вызывается COM-библиотекой)
2. Создается ClassFactory, вызывается конструктор класса
3. У созданного экземпляра ClassFactory запрашивается интерфейс IClassFactory (через QueryInterface)
4. Интерфейс запрошен, вызывается AddRef у ClassFactory
5. Вызывается Release у ClassFactory (количество ссылок на компонент ClassFactory к этому времени равно 2, будет 1)
6. На этом работа DllGetClassObject окончена.
7. Вызывается через интерфейс IClassFactory метод CreateInstance (вызывается COM-библиотекой)
8. Создается сам компонент, вызывается его конструктор (здесь, количество созданных компонентов тоже приращается в счетчик, но это не так важно)
9. Вызывается QueryInterface для запроса интерфейса, у меня IInputData
10. Вызывается AddRef для компонента
11. На этом работа CreateInstance завершена.

А вот здесь интересно.
12. Вызывается AddRef для компонента (откуда неизвестно, зачем, неизвестно)
13. Вызывается Release для компонента (также неизвестно откуда)
14. Вызывается Release для ClassFactory (тут вроде понятно, вызывается COM-библиотекой, после чего ClassFactory уничтожается)
15. Вызов QueryInterface у компонента. Кто запрашивает неизвестно, но известно, что запрашивается ровно тот интерфейс, который я уже запрашивал.
16. Соответственно вызывается AddRef, так как вызван успешно QI
17. Вызов Release у компонента

Все, после этого компонент создан и с ним можно работать.

В VB еще добавляется еще пункт
18. Запрашивается через QI что-то кроме IUnknown и моего интерфейса IInputData

После чего собственно VB и падает...

В чем может быть проблема? Что это за доп. вызовы QI?

UPD::

Черт, попробовал опять трассировать под VB библиотеку. Обнаружил, что интерфейс IUnputData не запрашивается вовсе. Вместо него запрашивается IUnknown.
А на 18-ом пункте все таки запрашивается не он, а что неизвестно.
Пишите жизнь на чистовик.....переписать не удастся.....

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

Re: Что делает CreateObject?

Сообщение Хакер » 03.05.2010 (Пн) 14:23

Фишка вот в чём. Я знаю, что ты пишешь в обход стандарта, потому что считаешь себя умнее стандарта («я могу думать, а стандарт — нет»). Например, я помню, что ты избегал правильной реализации AddRef/Release.

На самом деле, то, что ты сейчас имеешь проблемы, говорит об обратном: стандарт оказался умнее тебя. Напиши всё так, чтобы никакие положения требований не нарушались и всё заработает.

Да и список оказался неправильным...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Что делает CreateObject?

Сообщение SLIM » 03.05.2010 (Пн) 14:34

Я не пишу в обход стандарта.
Правильной реализации AddRef и Release я не избегал, я их просто не писал на начальном этапе. Сейчас пришло время и пишу.
Но мне все же кажется что ты не прочитал мой предыдущий пост.

Все же, мне как кажется, проблема вот в чем.
Когда в сях я вызываю CoCreateInstance, я напрямую указываю IID нужного мне интерфейса.
В VB же, CreateObject знать не знает какой интерфейс мне получить. Поэтому, видимо, он и запрашивает IUnknown, так как у CreateObject нет параметра с указанием IID интерфейса.

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

Соответственно, может быть я и пишу в обход стандарта, но сам я того не подозреваю. Информации об этом как-то маловато.

Ты бы лучше пост прочитал, и помог, если можешь\хочешь.
Пишите жизнь на чистовик.....переписать не удастся.....

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Что делает CreateObject?

Сообщение SLIM » 03.05.2010 (Пн) 17:27

Напал на статью BV http://sources.ru/magazine/1009/visual_c_vb_lugin.html
Все таки VB запрашивает IDispatch у библиотеки.
Это так?

З.Ы. Где же ты, BV...
Пишите жизнь на чистовик.....переписать не удастся.....

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Что делает CreateObject?

Сообщение SLIM » 03.05.2010 (Пн) 17:53

Опять таки, нашел пример, где работает COM-компонент в VB без IDispatch, правда создается он с помощью New
Пишите жизнь на чистовик.....переписать не удастся.....

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

Re: Что делает CreateObject?

Сообщение Хакер » 03.05.2010 (Пн) 18:06

Это так?

99%, что это не так. Без твоей воли запрашивать IDispatch никто не станет.

З.Ы. Где же ты, BV...

Где же ты, спаситель человечества... :lol:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Что делает CreateObject?

Сообщение SLIM » 03.05.2010 (Пн) 18:11

Смейся смейся.
Я то его, компонент все равно добью. С твоей помощью или без (скорее всего без, судя по твоему поведению).
Останется только этот топик с удачными как всегда насмешками и подколами
Пишите жизнь на чистовик.....переписать не удастся.....

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

Re: Что делает CreateObject?

Сообщение Хакер » 03.05.2010 (Пн) 18:14

А я мало способен помогать. Я собираю вещи, разбираю мебель. Разбираться в кишках библиотек не совсем по обстановке.

Да и, как говорится, аппендицит по фотографии не лечим. Да, доктор наук. Но по фотографии — не лечим.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Что делает CreateObject?

Сообщение SLIM » 03.05.2010 (Пн) 18:24

А у тебя было то что нужно - я давал.
Что еще нужно - еще дам.
Тебе ведь не нужно - ты мебель собираешь
Пишите жизнь на чистовик.....переписать не удастся.....

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

Re: Что делает CreateObject?

Сообщение Хакер » 03.05.2010 (Пн) 18:48

Исходники и описание проблемы. Нормальное, а не в стиле выражения негативных эмоций по поводу проблем.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Re: Что делает CreateObject?

Сообщение BV » 03.05.2010 (Пн) 20:38

SLIM писал(а):Напал на статью BV http://sources.ru/magazine/1009/visual_c_vb_lugin.html
Все таки VB запрашивает IDispatch у библиотеки.
Это так?

З.Ы. Где же ты, BV...

Прямо взял, и напал на неё, беззащитную

Думаю, тебе интереснее и полезнее будет почитать GSerg'а: http://vbstreets.ru/VB/Articles/65974.aspx
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

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

Re: Что делает CreateObject?

Сообщение Хакер » 03.05.2010 (Пн) 21:15

Не нужно читать эту статью: это отличная статья на тему того, как то, что можно сделать родными средствами языка, сделать с помощью недокументированных фишек. У неё ценность академическая, а не практическая.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Что делает CreateObject?

Сообщение SLIM » 03.05.2010 (Пн) 21:17

BV писал(а):Думаю, тебе интереснее и полезнее будет почитать GSerg'а

Читал я ее. Правда это не совсем то что мне нужно. Но все равно было полезно.

Ну, в общем, все заработало.
Заработало все после того, как я зарегистрировал библиотеку типов в системе, что меня смутило еще больше. Я считал что указание расположения tlb в References достаточно.

Вообще тут нужно поподробней разобраться

В IDL описание компонента (после описания интерфейса) выглядит так
Код: Выделить всё
[
   uuid(184B306A-6EAA-4507-9A46-82C0584CD2F0),
   version(1.0),
   helpstring ("Component")

]
library ABC
{

   [uuid(301B5C76-6F99-4570-AEBB-8EDD5D84A72F)]

   coclass Slot
   {
      [default]interface IInputData;
   }
}


Если в References указать путь к tlb, то присвоится имя Component.
И вообще, какое дело VB до uuid самой tlb? Вообще зачем регистрировать саму tlb то?
Пишите жизнь на чистовик.....переписать не удастся.....

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

Re: Что делает CreateObject?

Сообщение Хакер » 03.05.2010 (Пн) 21:22

Я считал что указание расположения tlb в References достаточно.

При указании tlb в References, первая, в общем-то, как раз и регистрируется в реестре силами VB.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Что делает CreateObject?

Сообщение SLIM » 03.05.2010 (Пн) 21:32

Хакер писал(а):При указании tlb в References, первая, в общем-то, как раз и регистрируется в реестре силами VB.

Каждый раз? И что, VB каждый раз генерирует uuid для tlb? Или VB берет ее из самой tlb? Почему тогда пока я вручную не зарегистрировал в путь к tlb,
HKEY_CLASSES_ROOT\TypeLib, а в HKEY_CLASSES_ROOT\CLSID не указал CLSID самой tlb в разделе TypeLib ничего не работало?

UPD::

Еще пару вопросов по IDL
Если функция в сях принимает параметр типа unsigned int, какой аналог указать в IDL?
И что указать в IDL если передается тип float**?
И как будет работать с такими указателями VB?

UDP::
Черт, куда же я залез. Чтобы передать двумерный массив в VB нужно очень постараться.
Пишите жизнь на чистовик.....переписать не удастся.....

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

Re: Что делает CreateObject?

Сообщение Хакер » 04.05.2010 (Вт) 6:53

Каждый раз?

Каждый, но правда с маленьким условием: читай о нём в описании LoadTypeLibEx.

И что, VB каждый раз генерирует uuid для tlb?

Это было бы (и есть) маразмом.\

Или VB берет ее из самой tlb?

Это было бы (и есть же) разумным.

Почему тогда пока я вручную не зарегистрировал в путь к tlb,
HKEY_CLASSES_ROOT\TypeLib

Без понятия. Наверняка это что-то вроде примет.

CLSID самой tlb

Это бред. Ещё раз читай.


Если функция в сях принимает параметр типа unsigned int, какой аналог указать в IDL?

Нарушаешь стандарт, это не COM-совместимый тип, нельзя.

И что указать в IDL если передается тип float**?

Нарушаешь стандарт, это не COM-совместимый тип, нельзя.

И как будет работать с такими указателями VB?

Не будет работать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Что делает CreateObject?

Сообщение Antonariy » 04.05.2010 (Вт) 9:47

Хакер писал(а):
Если функция в сях принимает параметр типа unsigned int, какой аналог указать в IDL?

Нарушаешь стандарт, это не COM-совместимый тип, нельзя.
Это тот случай, когда Object Browser или Watch показывает <unsupported variant type>?
Лучший способ понять что-то самому — объяснить это другому.

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

Re: Что делает CreateObject?

Сообщение Хакер » 04.05.2010 (Вт) 10:00

Да, один из них, но во втором случае Object Browser будет показывать As Single, хотя поюзать, конечно, не даст.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Что делает CreateObject?

Сообщение Antonariy » 04.05.2010 (Вт) 10:21

С некоторыми "неподдерживаемыми" типами умеет работать CallByName, обнаружил это, когда потребовалось изменить
Property CurrentViewMode As <Unsupported variant type>
Member of Shell32.ShellFolderView
Лучший способ понять что-то самому — объяснить это другому.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Что делает CreateObject?

Сообщение SLIM » 04.05.2010 (Вт) 20:17

Хакер писал(а):Нарушаешь стандарт, это не COM-совместимый тип, нельзя.

Можно конечно. SafeArray или Variant к примеру можно заюзать. Но головной болиииии.....
Хотя конечно еще вопрос как Vb будет с этим работать.
Вот, например Excel может заиметь двумерный массив и передать его. Например тому же VB.


З.Ы. Я вот смотрю на все это. А вообще, такая громоздкая технология оправдала себя кроме как в MS Office и других MS-продуктах? Обычные программисты используют написание COM-компонентов с нуля?
Пишите жизнь на чистовик.....переписать не удастся.....

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Что делает CreateObject?

Сообщение SLIM » 04.05.2010 (Вт) 22:40

Вообще, когда я впервые создал что-то отдаленно похожее на COM, возникло куча вопросов. И связанных с VB в частности.
То что сделал я - это вообще что? COM, вроде не совсем, вроде что-то больше чем просто COM. Для COM-а мне бы хватило реализовать сам компонент.
ActiveX - вроде ближе. Так как из цитаты Хакера
Технология ActiveX построена над COM и документирует некоторые вещи:

* Единый для всех способ обратиться к члену объекта по его строковому имени или проекто-совместимому идентификатору.
* Единый для всех способ получить море информации о COM-сервере.
* Единый для всех способ запросить у COM-сервера создание COM-объекта, при котором, к тому же, не трубется знать, где находится реализация COM-сервера.

Первый пункт у меня не поддерживается - это IDispatch.
Второй пункт реализован в виде tlb,Третий пункт реализован в виде фабрики классов.

Мне казалось, что IDispatch таки нужен для OLE Autamat., а не для ActiveX. Т.е. OLE = ActiveX + IDispatch.


Интересно, если VB полностью построен на COM, что есть в VB, например тот же класс? Как он располагается в памяти? Какие все таки переменные хранятся в памяти. Ведь не просто же Integer и long, это должно быть что-то свое, COM-кое. Или нет?

Куча, просто масса вопросов.
Пишите жизнь на чистовик.....переписать не удастся.....

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

Re: Что делает CreateObject?

Сообщение Хакер » 04.05.2010 (Вт) 23:16

Второй пункт реализован в виде tlb,Третий пункт реализован в виде фабрики классов.

Нифига, TLB должна быть внутри, иначе это не то.

Мне казалось, что IDispatch таки нужен для OLE Autamat., а не для ActiveX.

В твоей голове живут вымышленные персонажи. В частности, некий Автомат, да ещё и Оле! Не будет рабочего кода, пока в голое будут жить тролли. Ну а так: OLE Automation и ActiveX это по сути одно и то же.

Интересно, если VB полностью построен на COM, что есть в VB, например тот же класс? Как он располагается в памяти? Какие все таки переменные хранятся в памяти.

Это как раз то, что не должно интересовать. Чтобы не думать об этом, собственно, вся технология и создана.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Что делает CreateObject?

Сообщение SLIM » 04.05.2010 (Вт) 23:42

Хакер писал(а):Нифига, TLB должна быть внутри, иначе это не то.

Почему? Есть объективные причины? Или так диктует стандарт?
Хакер писал(а):В твоей голове живут вымышленные персонажи. В частности, некий Автомат, да ещё и Оле! Не будет рабочего кода, пока в голое будут жить тролли. Ну а так: OLE Automation и ActiveX это по сути одно и то же.

Ну ты же понял что я имел в виду OLE Autamation, и ничего кроме. Но все равно они должны же чем-то отличаться.
Хакер писал(а):Это как раз то, что не должно интересовать. Чтобы не думать об этом, собственно, вся технология и создана.

А мне интересно.

Ну ты так и не ответил. Что же все таки у меня то получилось? Гибрид недоделанный?
Пишите жизнь на чистовик.....переписать не удастся.....

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: Что делает CreateObject?

Сообщение Dmitriy2003 » 05.05.2010 (Ср) 0:10

SLIM писал(а):Куча, просто масса вопросов.

Ответы на многие вопросы - есть тута, не знаю есть ли у тебя эта книга, ну хуже точно не будет.
Модель COM и применение ATL 3.0

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Что делает CreateObject?

Сообщение SLIM » 05.05.2010 (Ср) 6:23

Есть у меня эта книга конечно. Не плохая книга. Много чего полезного узнал.
Мне бы еще OLE Inside заиметь на русском. Было бы вообще чудно.
Пишите жизнь на чистовик.....переписать не удастся.....


Вернуться в OLE / COM / ActiveX

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

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

    TopList