Здравствуйте, samius, Вы писали:
S>Для того что бы узнать, указывают ли pXXX и pYYY на интерфейсы одного COM объекта, по спеке нужно у pXXX и pYYY вызвать QI(IID_IUnknown, &tmp) и сравнить вернувшиеся указатели. S>Вопрос, существует ли способ реализовать QI БЕЗ ИСПОЛЬЗОВАНИЯ СОСТОЯНИЯ корректным образом (в соответствии со спекой), что бы он в случе различных pXXX и pYYY вернул одинаковый результат?
Да сортируешь все интерфейсы по значению GIUD, выбираешь первый, приводишь всегда к нему. Где тут состояние? Любое честное или неочень изменение объекта не нарушит данное поведение.
Можно добавить еще одну "грань" к которой приводить. И снова любое честное и неочень изменение состояния не нарушит поведение, специфицированное COM.
S>Так вот, QI(IID_IUnknown) должна возвращать указатель на IUnknown грань. В нетривиальных случаях, когда объект имеет multiple interface, результат QI(IID_IUnknown) должен где-то хранитсья.
Это будет еще одна грань напрмиер.
S>Подозреваю что в состоянии, а никак не в константе.
Ниугадал.
S>И QI должна будет взять указатель из состояния и вернуть его. И ты называешь это независимостью от состояния? Я ничего не попутал?
Никто ниоткуда ниче не должен брать. Это работает на уровне реализации наследования в языке и никакое состояние руками создавать не надо. А в .NET вообще есть interface map, там проблем таких в принципе нет.
Вообще странно что ты не можешь придумать как сделать множественное наследование интерфейсов, которое работает только через this. Эта задача уже многократно реализована.
S>>>QI не является детерминированной в общем случае. G>>Для IUnknown — является. Этого достаточно. S>Этого недостаточно что бы считать QI независящей от состояния даже в случае IUnknown.
А что тогда считать "независимостью от состояния"? Тогда любой из твоих ранее приведенных примеров идентичности зависит от состояния.
Независимость от состояния обозначает ровно одно — результат функции не меняется при любом (честно или нет) изменении состояния объекта.
В COM всегда можно сделать реализацию identity, которая при любом изменении состояния, не нарушающим целостность объекта, не будет зависеть от состояния.
G>>>>Если нужна реализация, то пусть возвращается всегда первый face. S>>>Я не понял, что такое первый face, откуда он берется, и почему он должен быть именно IUnknown гранью. G>>Первый по порядку (любому). S>Первый face по любому порядку не обязан быть IUnknown фэйсом, о чем ты?
Ты и сам говорил что любой интерфейс наследуется от IUnknown и сам хотел делать приведения. Так вот предлагаю делать эти приведения внутри QueryInterface.