Re: очень умные указатели
От: novik Россия  
Дата: 14.09.05 10:10
Оценка:
Здравствуйте, shurik., Вы писали:

S>есть такая проблема

S>как известно, директива #import генерит совсем умные смарт поинтеры, которые проверяют возвращаемое значение и в случае чего кидают екзепшн.

S>в моём ком-сервера активно используются внутренние (реализованные в этом же ком-сервера) коклассы.

S>соответсвенно для них тоже хочется смартпоинтеры, причём эти смарт поинтеры должны принимать в параметр шаблона не интерфейс и именно тип класса (чтобы использовать public-методы не описанные в интерфейсе)

S>попробовал CComPtr

S>возникло две проблемы:
S>1) оператор присвания отказывается работать (что-то типа ambigous conversion to IUnknown*, только на кой они конвертят тип шаблона к IUnknown я так и не понял). Но это проблема решаема.
S>2) естественно возвращаемые значения он не проверят, т.е. при использовании внутренних классов приходится оборачивать вызов метода в функцию которая проверяет возвращаемое значение. Такой подход мне не нравится. Хочется единообразия работы с внешними и внутренними коклассами.

S>основная проблема под номером 2.

S>Наверняка ведь кто-то сталкивался с подобной задачей?
S>может возможно написать свой смарт поинтер и как-нибудь хитро заставить его его получать обратно управление после вызова оператора '->', что бы проверить что же там вернул метод? или может такой уже есть готовый?

По моему опыту, я использую CoCreateinstance внутри сервера только для синхронизации вызова методов объектов через границы апартментов. А так стараюсь не обрезать себе функциональность методами интерфейса, а создаю полноценные классы типа CComObject<CMyClass>.

А чтобы решить вторую проблему можно создать производный класс
class
CMyClass : CComObject<CMyClass>

и переопределить ту же виртуальную функцию, только с нужной проверкой


class CMyClass : CComObject<CMyClass>
{
   public  STDMETHOD (Method) (...)
          {
             HRESULT hr = CMyClass::Metod (...)
             if FAILED (hr)
               ...
             return HR;
          }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.