本章内容包括
• “Generic XPCOM Module Macros”
• “String Classes in XPCOM”
• “Smart Pointers”
• “weblock2.cpp”
XPCOM Macros
Generic XPCOM Module Macros
入门指南对于建立通用的组件代码很有用的。但是只有少数地方的代码对于WebLock组件是独一无二的,而且需要大量的输入。要写一个不同的组件库,你可以复制章节结尾的清单,做很小的改动,然后粘贴到一个新的项目。为了避免这种冗余的工作,调节编写通用代码,减少输入,XPCOM提供generic module macros扩展模块代码。由于这些宏扩展到“通用”的实现,可能不会像你在编写自己的实现那么有灵活性。但是它使开发变得更快。
宏模块包括一组
宏,这些宏定义导出的NSGetModule入口点,
为你的实现类
创建一个通用的工厂。这些宏可以很好的管理
组件的实现代码,
让你更多的去关注组件的实际逻辑。
NS_IMPL_NSGETMODULE
(name, components) 用模块名称_name 和组件名称
_components.实现了nsIModule 接口
NS_IMPL_NSGETMODULE_WITH_CTOR
(name, components, ctor) 同上,但是可以指定当创建模块时调用
一个特殊函数
NS_IMPL_NSGETMODULE_WITH_DTOR
(name, components, dtor) 同上,但是可以指定当析构模块时调用一个特殊函数
NS_IMPL_NSGETMODULE_WITH_CTOR_DTOR
(name, components, ctor, dtor) 同上,但是可以分别指定当创建模块和析构模块时调 用特殊函数
Module Implementation Macros
一般情况下用NS_IMPL_NSGETMODULE ,
不需要任何回调,但所有的宏遵循相同的一般模式,
所有这些宏的数组结构由_components参数表示,
每个结构描述的是
在XPCOM注册
CID 。
这些宏的第一个参数是一个任意的字符串的模块名称,
在调试环境中,
当组件库加载或卸载时,
这个字符串将打印到屏幕上。
你应该选择一个对跟踪信息有帮助的名称,
结构
所需的四个部分
包含以下信息:
• 可读的类名
• CID
• contract ID
•
一个给定对象的构造函数
static const nsModuleComponentInfo components[] =
static const nsModuleComponentInfo components[] =
{
{ "Pretty Class Name",
CID,
CONTRACT_ID,
Constructor
},
....
}
在上面的虚构的清单中
需要注意
的事情是
它可以支持多个组件在一个模块。Gecko的
网络库在单一的nsModuleComponentInfo声明了超过50个组件。
nsModuleComponentInfo的第一个元素是组件名,
虽然目前内部使用它不是那么多,
这个名字应该是描述模块的。
第二项是 CID,通常的做法是把CID定义为宏,然后在组件列表中用CID的宏,许多CID的格式如下:
#define NS_IOSERVICE_CID \
{ /* 9ac9e770-18bc-11d3-9337-00104ba0fd40 */ \
0x9ac9e770, \
0x18bc, \
0x11d3, \
{0x93, 0x37, 0x00, 0x10, 0x4b, 0xa0, 0xfd, 0x40} \
}
下一个是Contract ID字符串, 这通常也在头文件用 #define进行定义。
这三个条目是
RegisterFactoryLocation方法
所需的参数,
当你使用这些实现宏,
你必须声明一个
对象的
构造函数。
这使你不必编写一个工厂对象。
Factory Macros.