Ну ежели ты хочешь, чтобы клиент мог создавать этот самый class2 только через один из методов
твоего интерфейса, то всё правильно. Лепи в IDL атрибут noncreateble к коклассу и всех делов.
Создавать и возвращать сам будешь. Ну а удаление объекта через Release. Как обычно.
Здравствуйте, kiamor, Вы писали:
K>Ну ежели ты хочешь, чтобы клиент мог создавать этот самый class2 только через один из методов K>твоего интерфейса
Да, именно это я пытаюсь сделать
K>Лепи в IDL атрибут noncreateble к коклассу и всех делов.
Я неправильно объяснил, проблема у меня именно в создании и возвращении указателя
Сейчас пытался сделать так:
Class1::connect(
/*[in]*/ BSTR User,
/*[in]*/ BSTR Pass,
/*[out]*/ IUnknown** pSrv)
{
HRESULT hr = S_OK;
CComObject<Class2> * pClass2 = NULL;
pSrv = NULL;
pClass2 = new CComObject<pClass2>;
hr = pClass2->QueryInterface( IID_IGrandSmetaSrv, reinterpret_cast<void **>(&pSrv) ) ;
if ( FAILED(hr) )
delete pClass2;
return hr;
}
В клиентской программе при выполнении этого метода все проходит отлично. Но при попытке как-то использовать объект pSrv
получаю ошибку 80004003 "Неправильный указатель".
Можно, но плохо, — (*pSrv)->AddRef().
Лучше — CComObject<Class2>::CreateInstance(pSrv) вместо pClass2 = new CComObject<Class2>;
А если не нужен доступ к тем переменным Class2, которые не вынесены в интерфейс, то ещё лучше — CoCreateInstance(...).
Vi2>if ( FAILED(hr) ) Vi2>delete pClass2; Vi2>return hr; Vi2>}
Лучший дар, который мы получили от природы и который лишает нас всякого права жаловаться – это возможность сбежать. /М.Монтень/
То есть — не удалять кокласс, уповая, что, когда ты освободишь объект в клиенте (обнулишь счетчик) он удалится сам собой, либо (как указал Thanatos) вызывать CCI (счетчик -> 1), затем QI (счетчик -> 2), а затем Release, который ничего не зарелизит (счетчик -> 1), но симметрия кода будет соблюдена, а вместе с ней и корректность.