В последнее время я работаю с MSHTML API, и мне это очень неудобно. Я больше привык к WinAPI, чем к COM-программированию, так что, возможно, это только я, но рассмотрим следующий пример запроса прямоугольника элемента;
Ожидания:
RECT rc;
hr = element2->GetElementRect(&rc);
реальность:
CComPtr<IHTMLRect> rect;
hr = element2->getBoundingClientRect(&rect);
if(FAILED(hr))
return hr;
if(!rect)
return E_FAIL;
long left, right, top, bottom;
hr = rect->get_left(&left);
if(FAILED(hr))
return hr;
hr = rect->get_right(&right);
if(FAILED(hr))
return hr;
hr = rect->get_top(&top);
if(FAILED(hr))
return hr;
hr = rect->get_bottom(&bottom);
if(FAILED(hr))
return hr;
Я что-то пропустил?
Мой вопрос: есть ли обертки для этого API? Конечно, умные указатели, такие как CComPtr
сделать все намного проще, но все же я чувствую, что борюсь с API.
Одним из способов является использование #import
директивы и использовать собственные классы поддержки COM компилятора C ++ вместо ATL (такие как _com_ptr_t<>
).
Ваш код сводится к двум строкам кода:
MSHTML::IHTMLElement2Ptr element;
MSHTML::IHTMLRectPtr rect = element->getBoundingClientRect();
RECT rc = { rect->left, rect->top, rect->right, rect->bottom };
Импортируйте mshtml как это:
#pragma warning(push)
// warning C4192: automatically excluding '<xyz>' while importing type library 'mshtml.tlb'
#pragma warning(disable: 4192)
#import <mshtml.tlb>
#pragma warning(pop)
Весь код котельной плиты скрыт, потому что #import
автоматически создает оболочки свойств и методы, выполняющие проверку HRESULT.
Других решений пока нет …