寻找C ++的MSHTML包装器

时间:2014-01-08 12:00:43

标签: c++ 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​​。

1 个答案:

答案 0 :(得分:2)

一种方法是使用#import指令并使用本机C ++编译器COM支持类而不是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检查的方法。