C++包装函数(宏)来访问 COM 对象属性
C++ wrapper function (macro) to access COM object properties
我有一个 COM 对象,其接口包含许多按以下方式定义的属性:
[propget] HRESULT Width([out, retval] LONG *lValue);
要从C++访问此类属性,我需要添加如下代码:
LONG lValue;
HRESULT hr = pInterface->get_Width(&lValue);
if (FAILED(hr)) lValue = DEFAULT_VALUE;
这个块不太长,但是当使用许多属性时,代码变得不那么好看。有没有办法将属性访问代码分离到某个宏或模板函数中,以便能够直接使用这些属性,如下所示:
printf("The width of the object is %d", GET_OBJECT_PROPERTY(pInterace, Width, DEFAULT_VALUE));
UPD:VC2008编译器用于构建项目
UPD:谢谢大家!这是我的解决方案:
template <class interface_type, class property_type>
property_type GetPropertyValue(interface_type* pInterface, HRESULT(STDMETHODCALLTYPE interface_type::*pFunc)(property_type*), property_type DefaultValue = 0)
{
property_type lValue;
HRESULT hr = (*pInterface.*pFunc)(&lValue);
if (FAILED(hr))
lValue = DefaultValue;
return lValue;
}
可以称为
LONG lVideoStreamCount = GetPropertyValue(pInfo, &IInterfaceName::get_VideoStreamCount);
我仍在寻找一种方法来消除调用中的"IInterfaceName:"部分。
#import "myInterface.tlb">
(正如汉斯已经在评论中所说的那样。真。我发现 COM C++无法忍受没有(
这将在默认设置中生成一个高级包装器。像你这样的属性通过__decspec(property(公开,这是一个特定于编译器的扩展:
LONG lValue = pInterface->Width;
[编辑] 更多信息:
对于编译 .idl,我禁用了 MIDL 的 C 标头生成(如果需要,代理/存根生成除外(。
使用默认 #import 设置:
- 你会得到高级包装器
- 将失败(小时(转换为
_com_error
异常 - 将
[out, retval]
转换为实际返回值, - 公开属性,就好像它们是属性一样
- 通过
raw_Method()
、get_Property()
等方式访问"原始"COM接口。
- 将失败(小时(转换为
- GUID 可通过
__uuidof()
获得,例如__uuidof(IMyInterface)
而不是IID_IMyInterface
. - 所有终止都位于基于 COM 库名称的命名空间中
但是,所有这些都可以通过 #import 属性进行配置。
我将我的 .idl 放在一个仅生成 .tlb 的单独项目中,并且我使用 #imported 标头来实现和使用接口。这意味着您必须对向导生成的代码进行一些调整,例如在 COM 方法实现前面加上 raw_
相关文章:
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 从 WinRT C++组件访问 COM 对象
- 如何访问从 COM 对象返回的 VARIANT 数据类型中的安全数组C++?
- 如何通过 COM 互操作访问复杂对象的属性?
- 无法访问 ATL/COM C++ Outlook 加载项中的邮件项目
- 设置com类的数组会触发读取访问
- 我可以从不同的线程访问COM对象的接口吗
- SslStream作为COM对象访问时响应不同
- 从未通过 C# 注册C++ COM 服务器访问 COM 接口
- 如何从C++和通过COM互操作性访问.NET类的属性
- 如何检测 C++/COM 中无法访问的代码
- COM:访问冲突,使 BSTR 的安全阵列
- C++包装函数(宏)来访问 COM 对象属性
- 访问C++中的COM接口时出现问题
- 两个线程(COM和WPF UI)访问同一个浮点
- Okcupid.com(无需访问数据库即可查找匹配项!?)
- 我可以通过Windows服务访问ititon.com界面吗?
- 使用c#从c++访问COM接口会产生错误