C++组件扩展:COM的新面孔

2011 年 9 月 20 日

目前 COM 编程仍然活跃在 Windows 平台上,但 C++ 的新变种使得它更易于使用。它叫做 C++ 组件扩展(Component Extensions),新的 Windows 运行时 WinRT 就是用这种新语言创建的。

尽管 C++ 组件扩展还是基于 COM,但它与.NET 编程非常类似。也就是说,你可以直接对类和对象进行操作,而不需要通过 COM 接口。

C++ 组件首先要创建一个公共类,并用“public ref class XXX sealed”的形式来定义,其中“XXX”是类名。这样声明的类叫做“可激活的类(activatable class)”,可以供.NET 和基于 JavaScript 的应用程序使用。“ref”关键字表示类是一种“与 Windows 运行时兼容的类型”。“sealed”关键字防止它被其它类继承,如果一个类想要被 JavaScript 使用,这是必要的条件。尽管文档没有明确说明,但似乎如果不从 JavaScript 使用,就不需要使用“sealed”关键字来声明类。例如, Button 类就继承了 ButtonBase。除了支持类之外,C++ 组件扩展还支持结构体。然而 Windows 运行时结构体仅限于裸数据成员(naked data members)使用。

类中可能会包含构造函数、方法、属性和事件。在类本身之外,你可能发现事件会使用“delegate”关键字。尽管这不是 C++ 或者 CLI,但出乎意料的是,这个语法使用“^”符号来结束。

在 C++ 组件扩展中,内存是基于它所使用的语言的语义来区别处理的。如果 C++ 应用程序使用了程序库,那么对象就会以引用的形式计算。当然,.NET 消费程序会使用 mark-and-sweep 的垃圾回收机制。

公有方法是通过 ABI(抽象二进制接口 Abstract Binary Interface)暴露出来的。这样的方法必须使用 Windows 运行时类型作为参数。C++ 的内建类型——像 int 和 double——会自动转换,而其他类型的转换都必须进行显式地声明。对于那些使用了 Platform::String 作为参数类型的公共方法,微软建议在方法内部应使用标准的 C++ 字符串类型。

通过 ABI 无法支持自定义的异常类型。开发者必须抛出一种内建的异常类型。如果还需要额外的信息,我们可以抛出一般的 COMException,它会使用 HRESULT 作为参数。

尽管 JavaScript 支持的类都要带有关键字“sealed”,但它至少还可以实现接口。

查看英文原文: C++ Component Extensions: The New Face of COM

2011 年 9 月 20 日 09:202016
用户头像

发布了 340 篇内容, 共 111.1 次阅读, 收获喜欢 2 次。

关注

评论

发布
暂无评论
发现更多内容

架构师训练营 - 第三周作业

kk

架构师训练营-作业3

紫极

架构师训练营-第三周-作业

狂奔嘀兔纸

极客大学架构师训练营

设计模式

丿淡忘

单例模式 极客大学架构师训练营 组合模式

聊聊设计模式——上篇

Jerry Tse

随笔 极客大学架构师训练营 作业 23种设计模式

设计模式学习实践

倪惠华

架构师训练营 第三周 个人感想

且听且吟

极客时间第 0 期架构师训练营第三周作业

2流程序员

架构师训练营第三周作业

Jerry Tse

极客大学架构师训练营 作业

第三周作业-命题作业

molly

极客大学架构师训练营

第3周 代码重构:代码重构能力是架构师最基本的能力

陆不得

作业3

annie

极客大学架构师训练营

第三周学习总结

CP

架构师训练营第3周作业

aoeiuvzcs

第三周总结

丿淡忘

极客大学架构师训练营

架构师训练营-第三章-作业

而立

极客大学架构师训练营

week03作业

Safufu

第三周学习总结

嘻哈

第三周作业

嘻哈

设计模式总结(golang版)

2流程序员

乘风破浪的5G,与隐藏在深海的EMC暗礁

脑极体

设计模式

张瑞浩

【架构师训练营】第 3 周作业

花生无翼

极客大学架构师训练营

面向对象设计模式课程作业

行下一首歌

极客大学架构师训练营

第三周作业

毛叫

极客大学架构师训练营

架构课第三周课后作业

张瑞浩

week03 学习总结

Safufu

week3 作业二

任鑫

架构师训练营第三周总结

W_T

浅析常用设计模式及应用场景

kk

架构学习(三)作业

漫步跑小鸡

C++组件扩展:COM的新面孔-InfoQ