寻找 MSHTML 包装器C++

Looking for an MSHTML wrapper for C++

本文关键字:C++ 包装 MSHTML 寻找      更新时间:2023-10-16

我最近在使用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 指令并使用本机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 检查的方法。