Я успешно создал и настроил свою надстройку Outlook в ATL.
Поскольку это нативная программа, написанная на c ++, я занимаюсь профилированием и охотой на утечки памяти. Я дважды проверил большую часть документации, и одна часть мне не понятна.
Кнопки в ленте и контекстном меню имеют функцию обратного вызова getImage, ожидающую IPictureDisp. У меня есть что-то вроде этого:
Gdiplus::Bitmap m_gdibmp;
...
STDMETHODIMP CConnect::GetButtonImage(IDispatch* ribbon, IPictureDisp** picture)
{
if (!picture)
return E_POINTER;
else
{
PICTDESC pictureDesc;
::ZeroMemory(&pictureDesc, sizeof(pictureDesc));
pictureDesc.cbSizeofstruct = sizeof(pictureDesc);
pictureDesc.picType = PICTYPE_BITMAP;
m_gdibmp->GetHBITMAP(NULL, &pictureDesc.bmp.hbitmap);
CComPtr<IPictureDisp> pIcon;
OleCreatePictureIndirect(&pictureDesc, IID_IPictureDisp, TRUE, (void**)&pIcon);
*picture = pIcon.Detach();
}
return S_OK;
}
По данным MSDN OleCreatePictureIndirect «вызывающий отвечает за вызов Release через этот указатель интерфейса, когда новый объект больше не нужен».
Нужно ли отслеживать этот указатель и использовать некоторые другие обратные вызовы, когда контекстное меню закрыто, и разблокировать его, или оно вызывается автоматически вызывающей стороной моего обратного вызова внутри?
Задача ещё не решена.
Других решений пока нет …