第1章 从C++转变到COM 1
实践1 在定义类之前定义接口(用IDL实现) 1
实践2 设计时牢记分布式的概念 8
实践3 对象不应该有自己的用户界面 15
实践4 当心COM单实例 16
实践5 不要允许C++的异常跨越方法边界 20
第2章 接口 27
实践6 接口是语法和松散的语义,二者都是不可变的 27
实践7 避免E_NOTIMPL 31
实践8 要类型化的数据,不要模糊的数据 32
实践9 避免连接点 37
实践10 不要为单个对象的同一接口提供多个实现 40
实践11 无类型语言失去了COM的优点 44
实践12 双接口是很苛刻的,不要强求人们去实现它 49
实践13 选择合适的数组类型(不要使用开放的和可变的数组) 51
实践14 避免将IUnknown作为一个静态类型化的对象引用(使用iid_is)传递 55
实践15 避免包含指针的[in,out]参数 58
实践16 注意循环引用(以及它们可能造成的问题) 61
实践17 避免使用wire_marshal,transmit_as,call_us以及cpp_quote 65
第3章 实现 69
实践18 防御性编码 69
实践19 总是初始化[out]参数 73
实践20 不要使用还没有被AddRef的接口指针 77
实践21 在桥接COM类型系统和C++类型系统时使用static_cast 83
实践22 智能指针带来的复杂性至少和它们消除的复杂性一样多 86
实践23 不要手工优化引用计数 91
实践24 使用延迟求值实现枚举器 93
实践25 适当地使用flyweight 96
实践26 避免跨单元边界使用tearoff 98
实践27 要特别地小心使用BSTR 100
实践28 COM聚合和包容只是一种身份诡计,而不是代码重用 102
第4章 单元 107
实践29 不要跨单元边界访问原始接口指针 107
实践30 当在MTA线程之间传递接口指针时,使用AddRef 110
实践31 用户界面线程和对象必须在单线程单元(STA)中运行 112
实践32 避免从进程内服务器创建线程 114
实践33 小心FTM 116
实践34 当心MTA中的物理锁 121
实践35 STA可能也需要锁 125
实践36 避免扩展进程内对象上的现存列集 129
实践37 当你提前退出时,请使用CoDisconnectObject来通知存根 131
第5章 安全 133
实践38 CoInitializeSecurity是你的朋友,要学习它、爱它、调用它 133
实践39 避免以激活者方式激活 139
实践40 避免伪装 143
实践41 使用细粒度验证 146
实践42 使用细粒度访问控制 151
第6章 事务 157
实践43 使事务尽可能短 157
实践44 当分发自己的对象的指针时总是使用SafeRef 158
实践45 不要跨活动边界共享对象引用 161
实践46 小心从事务层次的中间公开对象引用 163
实践47 小心隐式地提交事务 166
实践48 在适当的时候使用非事务对象 166
实践49 把重要的初始化移到IObjectControl∷Activate 168
实践50 不要依赖JIT激活和ASAP停用来实现可伸缩性 169
结束语 171
关于作者 173
索引 175