寻找 MSHTML 包装器C++
Looking for an MSHTML wrapper for C++
我最近在使用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 检查的方法。
相关文章:
- 如何在c++17中制作一个模板包装器/装饰器
- std::vector的包装器,使数组的结构看起来像结构的数组
- 如何在c++迭代器类型中包装std::chrono
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- 用pybind11包装C++抽象类时出错
- 为左值和右值的包装器实现C++范围
- C结构,其指针将被包装在unique_ptr中
- 如何包装第三方DLL在R中使用
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 将 N-arg 函数包装到另一个函数中
- 元组由 Swig 生成的 Python 包装器返回,用于C++向量
- 包装一个对象并假装它是一个 int
- 使用 Python Extension API 包装复杂C++类
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 包装C++类时不完整的类型 GLFWwindow
- 将函数包装器转换为 std::function
- C++函数包装器来捕获某些信号
- 创建包装升压适配器的自定义范围类
- 如何包装(撰写)增强 hana 地图并访问括号运算符(运算符 [])?
- 使用运算符*重载包装矩阵乘法