Здравствуйте Цунцуяби, Вы писали:
Ц>Пробовал написать по примерам с ATL, но я пока не понимаю всю картину вцелом
Ц>и поэтому смущает, что каждый раз когда я вызываю метод Item
Ц>у меня каждый раз создается и инициализируется объект
Ц>Ц>STDMETHODIMP CComXcl::Item(short n, LPDISPATCH *retval)
Ц>{
Ц> CComObject<CComYcl>* p = new CComObject<CComYcl>;
Ц> p->DoNotForgetInitItem();
Ц> IDispatch* pDisp;
Ц> HRESULT res=p->QueryInterface(IID_IDispatch, (void**)&pDisp);
Ц> if (res != S_OK) return E_POINTER;
Ц> *retval = pDisp;
Ц> return S_OK;
Ц>}
Ц>
Ц>Может быть его надо где-то сохранять ?
Да. В статическом члене. Типа
// где- то в *.h, в определении класса
static map<short, CComPtr<IDispatch> arrayItems;
STDMETHODIMP CComXcl::Item(short n, LPDISPATCH *retval)
{
...
if(arrayItems.find(n) != arrayItems.end()) {
CComObject<CComYcl>* p = new CComObject<CComYcl>;
p->DoNotForgetInitItem();
IDispatch* pDisp;
HRESULT res=p->QueryInterface(IID_IDispatch, (void**)&pDisp);
if (res != S_OK) {
return E_POINTER;
}
arrayItems[n] = pDisp;
*retval = pDisp;
return S_OK;
} else {
*retval = arrayItems[n].Detach();
return S_OK;
}
}
Писал без компилятора, могут быть ошибки. Но где-то так.