第9章 编程工作的简化
1、客户端的简化:可使用智能接口指针和C++包装类。
2、智能接口指针:像常规接口指针一样访问组件,将引用计数等细节隐藏起来,并且当程序的执行离开了智能接口指针的作用于之后,相应的接口将被释放掉。不适合封装某个接口或接口集。智能接口指针同组件的聚合类似。
3、C++包装类:对接口进行封装。包装类最佳的一些特性在于它们可以利用C++的一些特性,如重载等。包装类实际上同组件的包容类似。
5、同智能指针不同的是:
(1)不论包装类是否要改变接口的行为,它都必须重新实现它所包装的接口中的所有成员。
(2)包装类可以在调用接口成员函数前后加上新的代码。
6、服务器端的简化:未知接口基类CUnknown和类厂基类CFactory。
7、使用CUnknown和CFactory来编写组件的步骤:
(a)编写实现组件的类。
(1)可以从CUnknown或其他从CUnknown派生的类派生出待实现的组件。
(2)使用DECLARE_IUNKNOWN宏来实现代理未知接口。
(3)在组件的构造函数中初始化CUnknown。
(4)实现NondelegatingQueryInterface,在其中加入此组件支持而其他基类不支持的接口。对于那些组件所不支持的接口,可调用相应的基类。
(5)若需要在构造了组件之后进行其他一些初始化处理,可重载Init函数,如此时可建立被包容及被聚合的组件。
(6)若需要在组件被删除之前进行其他一些情理工作,可重载FinalRelease函数,如此时可以释放那些指向被包容或聚合的组件的指针。
(7)给组件实现一个静态的CreateInstance函数。
(8)实现组件支持的那些接口。
(b)对于待放到同DLL种的其他组件,重复上面的步骤(a)。
(c)编写类厂
(1)建立一个文件,以包含全局CFactoryData数组g_FactoryDataArray。
(2)定义g_FactoryDataArray数组并用DLL中提供的所有组件的信息填充此组件。
(3)定义变量g_cFactoryDataEntries,其中包含有数组g_FactoryDataArray中组件的个数。
(d)编写一个定义DLL入口点的DEF文件。
(e)将上面所编写的代码同CUNKNOWN.CPP和CFACTORY.CPP一块编译链接。
8、使用智能接口指针来编写客户端和CUnknown、CFactory来编写组件的示例代码:
优快云我的资源中InsideCOM\CHAP09XXX。