2014-01-08 2 views
0

В последнее время я работаю с MSHTML API, и мне это очень неудобно. Я больше привык к WinAPI, а затем программированию COM, поэтому, возможно, это только я, но рассмотрим следующий пример запроса прямоугольника элемента;Ищет оболочку MSHTML для C++

Ожидания:

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.

ответ

2

Один из способов - использовать директиву #import и использовать классы поддержки COM-компилятора C++ вместо ATL (например, _com_ptr_t<>).

Ваш код затем сводится к 2 строкам коды:

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.

+0

Выглядит очень многообещающе, спасибо! Я никогда не видел использование #import раньше. Является ли этот API документированным где угодно? Что происходит при ошибке, вызывает ли это исключение? Убирают ли переменные при уничтожении? – Paul

+0

Вы обнаруживаете '# import' в [документации MSDN] (http://msdn.microsoft.com/en-us/library/8etzzkb6.aspx). ['_com_ptr_t'] (http://msdn.microsoft.com/en-us/library/417w8b3b.aspx) - это умный указатель, поэтому он в любом случае правильно очищает. –

+0

Да, это именно то, что я искал, спасибо! Чтобы ответить на мой последний оставшийся без ответа вопрос: «Что происходит при ошибке, вызывает ли это исключение?» - Да, '_com_error'. – Paul

Смежные вопросы