Re[110]: ООП головного мозга
От: Patalog Россия  
Дата: 18.10.11 13:46
Оценка:
Здравствуйте, Sinclair, Вы писали:

[]

S>Нет. Не надо усложнять. COM говорит о том, что интерфейсы могут наследоваться друг от друга, но любой интерфейс, явно или неявно, обязан наследоваться от IUnknown.


Что есть наследование в данном случае? Возможность вызова методов IUnknown от любого интерфейса?

S>Что именно вам непонятно?


Вот —

Тогда приведи корректный с точки зрения COM способ получения разных указателей на IUnknown для одного объекта.


Афаик, финты типа
IUnknown* u1 = QI(...)
IUnknown* u2 = (IUnknown*)some_iface_ptr;

не корректны с точки зрения COM, поскольку identity определяется через QI.
Почетный кавалер ордена Совка.
Re[108]: ООП головного мозга
От: Patalog Россия  
Дата: 18.10.11 13:49
Оценка:
Здравствуйте, samius, Вы писали:

хъ

S>

S>3.3 The IUnknown Interface
S>This specification has already mentioned the IUnknown interface many times. It is the fun-
S>damental interface in COM that contains basic operations of not only all objects, but all
S>interfaces as well: reference counting and QueryInterface. All interfaces in COM are poly-
S>morphic with IUnknown, that is, if you look at the first three functions in any interface you
S>see QueryInterface, AddRef, and Release. In other words, IUnknown is base interface from which
S>all other interfaces inherit.


Ну и? Тут как раз и говориться, про то, что от любого интерфейса можно вызвать методы IUnknown.
Меня интересует

Тогда приведи корректный с точки зрения COM способ получения разных указателей на IUnknown для одного объекта.

Почетный кавалер ордена Совка.
Re[109]: ООП головного мозга
От: samius Япония http://sams-tricks.blogspot.com
Дата: 18.10.11 14:21
Оценка: +1
Здравствуйте, Patalog, Вы писали:

P>Здравствуйте, samius, Вы писали:


P>хъ


S>>

S>>3.3 The IUnknown Interface
S>>This specification has already mentioned the IUnknown interface many times. It is the fun-
S>>damental interface in COM that contains basic operations of not only all objects, but all
S>>interfaces as well: reference counting and QueryInterface. All interfaces in COM are poly-
S>>morphic with IUnknown, that is, if you look at the first three functions in any interface you
S>>see QueryInterface, AddRef, and Release. In other words, IUnknown is base interface from which
S>>all other interfaces inherit.


P>Ну и? Тут как раз и говориться, про то, что от любого интерфейса можно вызвать методы IUnknown.

P>Меня интересует
P>

P>Тогда приведи корректный с точки зрения COM способ получения разных указателей на IUnknown для одного объекта.

IUnknown pUnk1 = ...;
IUnknown pUnk2;
pUnk1->QueryInterface(IID_ISomeInterface, &pUnk2);

Из того что все интерфейсы полиморфны IUnknown, следует, что полученный pUnk2 является легальным указателем на IUnknown. Способ его получения легален, хоть и не гарантирует получения отличного указателя.

COM идентичность говорит только о том, что что бы понять, являются ли эти указатели указателями на интерфейсы одного объекта, необходимо вызвать у каждого QI(IID_IUknown) и сравнить результаты.
Re[111]: ООП головного мозга
От: Sinclair Россия https://github.com/evilguest/
Дата: 18.10.11 16:56
Оценка:
Здравствуйте, Patalog, Вы писали:


P>Что есть наследование в данном случае? Возможность вызова методов IUnknown от любого интерфейса?

В данном случае наследование означает, что любой, реализующий методы интерфейса IWebBrowser3, автоматически обязан реализовать методы интерфейса IWebBrowser2.

S>>Что именно вам непонятно?


P>Вот —

P>

P>Тогда приведи корректный с точки зрения COM способ получения разных указателей на IUnknown для одного объекта.


P>Афаик, финты типа

P>не корректны с точки зрения COM, поскольку identity определяется через QI.
Я продолжаю непонимать, что вам непонятно.
Да, есть способ получить два разных указателя на IUnknown для одного объекта, оставаясь в рамках стандарта. Да, identity определяется через QI(IID_IUnknown). Эти два факта тесно связаны между собой, как равенство нулю массы покоя фотона и отсутствие продольной составляющей у электромагнитных колебаний.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[112]: ООП головного мозга
От: Patalog Россия  
Дата: 18.10.11 17:19
Оценка:
Здравствуйте, Sinclair, Вы писали:

хъ

P>>Что есть наследование в данном случае? Возможность вызова методов IUnknown от любого интерфейса?


S>В данном случае наследование означает, что любой, реализующий методы интерфейса IWebBrowser3, автоматически обязан реализовать методы интерфейса IWebBrowser2.


Афаик, стандарт говорит про обязательность такого наследования только для IUnknown. Разве для произвольных интерфейсов (IWebBrowser3<-IWebBrowser2)
такое требование есть? То, что оно в реальности так разве не следствие того, что нельзя менять опубликованные интерфейсы?

хъ

S>Я продолжаю непонимать, что вам непонятно.

S>Да, есть способ получить два разных указателя на IUnknown для одного объекта, оставаясь в рамках стандарта.

Как? Откастив? Ком ничего не знает про приведения типов. Легальный способ получить IUnknown у объекта — это QI.
Каким образом получить два разных указателя на IUnknown через QI, при условии что компонент не нарушает правила кома — мне не понятно.
Почетный кавалер ордена Совка.
Re[110]: ООП головного мозга
От: Patalog Россия  
Дата: 18.10.11 17:27
Оценка:
Здравствуйте, samius, Вы писали:

хъ

S>>>

S>>>3.3 The IUnknown Interface
S>>>This specification has already mentioned the IUnknown interface many times. It is the fun-
S>>>damental interface in COM that contains basic operations of not only all objects, but all
S>>>interfaces as well: reference counting and QueryInterface. All interfaces in COM are poly-
S>>>morphic with IUnknown, that is, if you look at the first three functions in any interface you
S>>>see QueryInterface, AddRef, and Release. In other words, IUnknown is base interface from which
S>>>all other interfaces inherit.


хъ

S>
S>IUnknown pUnk1 = ...;
S>IUnknown pUnk2;
S>pUnk1->QueryInterface(IID_ISomeInterface, &pUnk2);
S>

S>Из того что все интерфейсы полиморфны IUnknown, следует, что полученный pUnk2 является легальным указателем на IUnknown. Способ его получения легален, хоть и не гарантирует получения отличного указателя.

Полученный указатель является легальным указателем на ISomeInterface.
В приведенной цитате стандарта не просто так говориться про наследование поведения.
Откуда следует, что "полиморфен IUnknown" (т.е. reference counting and QueryInterface) означает "легальным указателем на IUnknown"?
По принципу duck typing что-ли?
Почетный кавалер ордена Совка.
Re[111]: ООП головного мозга
От: samius Япония http://sams-tricks.blogspot.com
Дата: 18.10.11 18:07
Оценка:
Здравствуйте, Patalog, Вы писали:

P>Здравствуйте, samius, Вы писали:


P>хъ


S>>>>

S>>>>interfaces as well: reference counting and QueryInterface. All interfaces in COM are poly-
S>>>>morphic with IUnknown
, that is, if you look at the first three functions in any interface you
S>>>>see QueryInterface, AddRef, and Release. In other words, IUnknown is base interface from which
S>>>>all other interfaces inherit.


P>хъ


S>>
S>>IUnknown pUnk1 = ...;
S>>IUnknown pUnk2;
S>>pUnk1->QueryInterface(IID_ISomeInterface, &pUnk2);
S>>

S>>Из того что все интерфейсы полиморфны IUnknown, следует, что полученный pUnk2 является легальным указателем на IUnknown. Способ его получения легален, хоть и не гарантирует получения отличного указателя.

P>Полученный указатель является легальным указателем на ISomeInterface.

P>В приведенной цитате стандарта не просто так говориться про наследование поведения.
P>Откуда следует, что "полиморфен IUnknown" (т.е. reference counting and QueryInterface) означает "легальным указателем на IUnknown"?
Из спецификации следует и по двоичному стандарту тоже.
P>По принципу duck typing что-ли?
По принципу устройства vtbl. duck typing там тоже имеет место и его обеспечивает IDispatch. Но речь именно о vtbl.

2.1.2 Interfaces and Inheritance
COM separates class hierarchy (or indeed any other implementation technology) from
interface hierarchy and both of those from any implementation hierarchy. Therefore,
interface inheritance is only applied to reuse the definition of the contract associated
with the base interface. There is no selective inheritance in COM: if one interface inher-
its from another, it includes all the functions that the other interface defines, for the
same reason than an object must implement all interface functions it inherits.

Re[113]: ООП головного мозга
От: samius Япония http://sams-tricks.blogspot.com
Дата: 18.10.11 18:14
Оценка:
Здравствуйте, Patalog, Вы писали:

P>Здравствуйте, Sinclair, Вы писали:


P>хъ


S>>В данном случае наследование означает, что любой, реализующий методы интерфейса IWebBrowser3, автоматически обязан реализовать методы интерфейса IWebBrowser2.


P>Афаик, стандарт говорит про обязательность такого наследования только для IUnknown. Разве для произвольных интерфейсов (IWebBrowser3<-IWebBrowser2)

При условии объявления того что IWebBrowser3 наследуется от IWebBrowser2. (но IWebBrowser2 не имеет родственных связей с IWebBrowser теснее чем через общих предков IDispatch, IUnknown)
P>такое требование есть? То, что оно в реальности так разве не следствие того, что нельзя менять опубликованные интерфейсы?
Есть такое требование (2.1.2)
А то что нельзя менять опубликованные интерфейсы — это для обеспечения совместимости.

P>хъ


S>>Я продолжаю непонимать, что вам непонятно.

S>>Да, есть способ получить два разных указателя на IUnknown для одного объекта, оставаясь в рамках стандарта.

P>Как? Откастив? Ком ничего не знает про приведения типов. Легальный способ получить IUnknown у объекта — это QI.

Ком знает про полиморфизм любого интерфейса с IUnknown
P>Каким образом получить два разных указателя на IUnknown через QI, при условии что компонент не нарушает правила кома — мне не понятно.
Где в правилах COM написано что нельзя приводить указатель на интерфейс к IUnknown* ? Можно цитату?
Re[114]: ООП головного мозга
От: Patalog Россия  
Дата: 19.10.11 01:47
Оценка:
Здравствуйте, samius, Вы писали:

[]

S>Где в правилах COM написано что нельзя приводить указатель на интерфейс к IUnknown* ? Можно цитату?


Я не знаток стандарта ком, так что цитату не дам.
И хочу уточнить, если ты не заметил — я с вами (с тобой и Синклером) вообще говоря не спорю, просто хочу разобраться.

Афаик, ком не может говорить ничего такого, поскольку он ничего не знает ни про какие приведения типов. "Приведение типов" там ровно одно — QI.
Вообще говоря, спор в этом топике крутился вокруг IUnknown & identity. Правильно ли я понимаю, что ведя речь про то, что комовская идентичность опирается на состояние объекта, имеется в виду агрегация и ссылка на внешний объект в агрегате?
Почетный кавалер ордена Совка.
Re[112]: ООП головного мозга
От: Patalog Россия  
Дата: 19.10.11 01:48
Оценка:
Здравствуйте, samius, Вы писали:

[]

S>Из спецификации следует и по двоичному стандарту тоже.


P>>По принципу duck typing что-ли?


S>По принципу устройства vtbl. duck typing там тоже имеет место и его обеспечивает IDispatch. Но речь именно о vtbl.

S>

S>2.1.2 Interfaces and Inheritance
S>COM separates class hierarchy (or indeed any other implementation technology) from
S>interface hierarchy and both of those from any implementation hierarchy. Therefore,
S>interface inheritance is only applied to reuse the definition of the contract associated
S>with the base interface. There is no selective inheritance in COM: if one interface inher-
S>its from another, it includes all the functions that the other interface defines, for the
S>same reason than an object must implement all interface functions it inherits.


Спасибо за цитату, это как раз то, про что я говорил — наследуется поведение (контракт). Наследования в понимании того же С++, когда class B : pulic A означает B is A и B* ptr является также указателем на A — в случае интерфейсов кома нет.
Т.е. —
ISomeInterface
{
  //first 3 methods
  AddRef
  Release
  QueryInterface
  //other some interface methods
};

Наследует ли данный интерфейс IUnknown в терминах кома? Имхо — да. Является ли указатель на данный интерфейс указателем на IUnknown? Имхо — нет.
Почетный кавалер ордена Совка.
Re[115]: ООП головного мозга
От: samius Япония http://sams-tricks.blogspot.com
Дата: 19.10.11 05:38
Оценка: +1
Здравствуйте, Patalog, Вы писали:

P>Здравствуйте, samius, Вы писали:


P>[]


S>>Где в правилах COM написано что нельзя приводить указатель на интерфейс к IUnknown* ? Можно цитату?


P>Я не знаток стандарта ком, так что цитату не дам.

P>И хочу уточнить, если ты не заметил — я с вами (с тобой и Синклером) вообще говоря не спорю, просто хочу разобраться.
Хорошо, давай разбираться. Но я тоже не знаток стандарта. Я его и не видел пока в этом топике ссылка не появилась. При случае открываю и делаю поиск в спецификации.

P>Афаик, ком не может говорить ничего такого, поскольку он ничего не знает ни про какие приведения типов. "Приведение типов" там ровно одно — QI.

QI это способ навигации между интерфейсами объекта. А приведение указателя интерфейса к указателю на IUnknown основано на двоичном стандарте vtbl, который использует COM для вызова методов, который "is exactly what most C++ compilers generate on PC and many RISC platforms".

P>Вообще говоря, спор в этом топике крутился вокруг IUnknown & identity. Правильно ли я понимаю, что ведя речь про то, что комовская идентичность опирается на состояние объекта, имеется в виду агрегация и ссылка на внешний объект в агрегате?

Да, но я бы перефразировал следующим образом: в связи с тем, что в COM заложены реюз и расширение объекта с помощью агрегации, COM identity опирается на специальные свойства метода QI, которые потребованы стандартом. В случае навигации между multiple interfaces одного объекта, предполагается использовать внутреннее состояние, хранящееся в объектах (не COM), реализующих COM интерфейсы COM объекта. Точнее не предполагается, а я не вижу способа обеспечить навигацию между различными интерфейсами без использования состояния.
Re[113]: ООП головного мозга
От: samius Япония http://sams-tricks.blogspot.com
Дата: 19.10.11 05:48
Оценка:
Здравствуйте, Patalog, Вы писали:

P>Здравствуйте, samius, Вы писали:


P>[]


S>>Из спецификации следует и по двоичному стандарту тоже.


P>>>По принципу duck typing что-ли?


S>>По принципу устройства vtbl. duck typing там тоже имеет место и его обеспечивает IDispatch. Но речь именно о vtbl.

S>>

S>>2.1.2 Interfaces and Inheritance
S>>COM separates class hierarchy (or indeed any other implementation technology) from
S>>interface hierarchy and both of those from any implementation hierarchy. Therefore,
S>>interface inheritance is only applied to reuse the definition of the contract associated
S>>with the base interface. There is no selective inheritance in COM: if one interface inher-
S>>its from another, it includes all the functions that the other interface defines, for the
S>>same reason than an object must implement all interface functions it inherits.


P>Спасибо за цитату, это как раз то, про что я говорил — наследуется поведение (контракт). Наследования в понимании того же С++, когда class B : pulic A означает B is A и B* ptr является также указателем на A — в случае интерфейсов кома нет.

Есть. Это наследование обеспечено двоичным стандартом vtbl.

P>Т.е. —

P>
P>ISomeInterface
P>{
P>  //first 3 methods
P>  AddRef
P>  Release
P>  QueryInterface
P>  //other some interface methods
P>};
P>

P>Наследует ли данный интерфейс IUnknown в терминах кома? Имхо — да. Является ли указатель на данный интерфейс указателем на IUnknown? Имхо — нет.
Если здесь описан корректный интерфейс в отношении двоичного стандарта vtbl COM, то указатель на данный интерфейс будет указателем на IUnknown. Если двоичный стандарт vtbl нарушен, тогда — не будет являться. Но в этом случае это будет и не COM.

В спеке есть параграф
3.1.4 C vs C++ vs...
В нем как раз описывается как на C сделать объект, удовлетворяющий стандарту vtbl. Корректно собранный такой объект позволит обращаться к себе через указатель на интерфейс IUnknown в терминах C++.
Re[113]: ООП головного мозга
От: Sinclair Россия https://github.com/evilguest/
Дата: 19.10.11 07:22
Оценка:
Здравствуйте, Patalog, Вы писали:

P>Афаик, стандарт говорит про обязательность такого наследования только для IUnknown. Разве для произвольных интерфейсов (IWebBrowser3<-IWebBrowser2)

P>такое требование есть? То, что оно в реальности так разве не следствие того, что нельзя менять опубликованные интерфейсы?

Inheritance in COM does not mean code reuse. Because no implementations are associated with interfaces, interface inheritance does not mean code inheritance. It means only that the contract associated with an interface is inherited in a C++ pure-virtual base-class fashion and modified — either by adding new methods or by further qualifying the allowed usage of methods. There is no selective inheritance in COM. If one interface inherits from another, it includes all the methods that the other interface defines.

здесь

P>Как? Откастив? Ком ничего не знает про приведения типов.

Простите, COM знает всё про приведения типов. Это бинарный стандарт на устройство VMT.
P>Легальный способ получить IUnknown у объекта — это QI.
C точки зрения совместимости типов, указатель на любой интерфейс является также и указателем на IUnknown.
P>Каким образом получить два разных указателя на IUnknown через QI, при условии что компонент не нарушает правила кома — мне не понятно.
Это расстраивает.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[115]: ООП головного мозга
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.10.11 11:14
Оценка: +1
Здравствуйте, Patalog, Вы писали:

S>>Где в правилах COM написано что нельзя приводить указатель на интерфейс к IUnknown* ? Можно цитату?


P>Я не знаток стандарта ком, так что цитату не дам.

P>И хочу уточнить, если ты не заметил — я с вами (с тобой и Синклером) вообще говоря не спорю, просто хочу разобраться.

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

P>Афаик, ком не может говорить ничего такого, поскольку он ничего не знает ни про какие приведения типов. "Приведение типов" там ровно одно — QI.


COM не знает про приведения типов. COM знает про интерфейсы. Про приведения типов знают языки, которые реализуют COM. В com есть два механизма расширения интерфейсов — containment/delegation и aggregation. Первый из них реализуется через наследование, а это самое наследование полностью укладывается в бинарный стандарт COM.

Т.е. если IWebBrowser2 описан в IDL как interface IWebBrowser2 : IWebBrowser то это значит, что в его VMT будут все методы IWebBrowser.

В языке C для VMT будет использован cfront а не thunk, т.е. даже здесь будет фактически приведение типов
Re[114]: ООП головного мозга
От: Patalog Россия  
Дата: 19.10.11 12:37
Оценка:
Здравствуйте, Sinclair, Вы писали:

[]

S>C точки зрения совместимости типов, указатель на любой интерфейс является также и указателем на IUnknown.


P>>Каким образом получить два разных указателя на IUnknown через QI, при условии что компонент не нарушает правила кома — мне не понятно.


S>Это расстраивает.


Диссонанс у меня возник по поводу того, что приведя любой интерфейс к IUnknown мы получим валидный указатель.
Точнее я не вижу в этом смысла, поскольку использовать такой указатель для identity все равно нельзя (а контекст топика именно об этом), а вызвать методы IUnknown можно и без всякого приведения.
Почетный кавалер ордена Совка.
Re[115]: ООП головного мозга
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.10.11 12:54
Оценка:
Здравствуйте, Patalog, Вы писали:

P>Диссонанс у меня возник по поводу того, что приведя любой интерфейс к IUnknown мы получим валидный указатель.

P>Точнее я не вижу в этом смысла, поскольку использовать такой указатель для identity все равно нельзя (а контекст топика именно об этом), а вызвать методы IUnknown можно и без всякого приведения.

Это всё объясняется в книг Дона Бокса "Essential COM". Как раз из за всяких delegation, aggregation нельзя использоть любой IUnkwon* для идентити.
Re[116]: ООП головного мозга
От: Patalog Россия  
Дата: 19.10.11 17:30
Оценка:
Здравствуйте, Ikemefula, Вы писали:

[]

I>Это всё объясняется в книг Дона Бокса "Essential COM". Как раз из за всяких delegation, aggregation нельзя использоть любой IUnkwon* для идентити.


Спасибо, кэп. =)
Почетный кавалер ордена Совка.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.