Здравствуйте, 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;
}
}