我最近正在使用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 :(得分: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检查的方法。