atl — Ищем оболочку MSHTML для переполнения стека

В последнее время я работаю с 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.

0

Решение

Одним из способов является использование #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.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]