通用型XPCOM模块宏
宏<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
|
作用
|
NS_IMPL_NSGETMODULE(name, components)
|
实现IModule接口
|
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)
|
结合2,3
|
模块实现宏:
nsModuleComponentInfo结构体包含4个域:1)给人读的类名称 2)类ID(CID) 3)契约ID 4)用于给定对象的构造者
staticconstnsModuleComponentInfocomponents[]=


{


{"PrettyClassName",
CID,
CONTRACT_ID,
Constructor
},

.
}
工厂宏:
NS_GENERIC_FACTORY_CONSTRUCTOR(ConcreteClass)
常用实现宏
NS_IMPL_ISUPPORTS1(classname,interface1)
NS_IMPL_ISUPPORTSn(classname,interface1,…,interfacen)
声明宏:
classmyEnumerator:publicnsISimpleEnumerator


{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSISIMPLEENUMERATOR
myEnumerator();

virtual~myEnumerator()
{}
};
NS_IMPL_ISUPPORTSn
|
为指定类实现nsISupports,此类有n个接口
|
NS_DECL_ISUPPORTS
|
声明ISuppotrs接口的方法,包含mRefCnt
|
NS_INIT_ISUPPORTS
|
初始化mRefCnt为0
|
NS_GET_IID
|
返回给定接口名称的IID
|
智能指针


{
nsCOMPtr<nsISupports>value;
object->method(getter_AddRefs(value));
if(!value)return;


if(NS_FAILED(error))
return;


}

SomeClass::Get(nsISupports**aResult)


{
if(!aResult)
returnNS_ERROR_NULL_POINTER;
nsCOMPtr<nsISupports>value;
object->method(getter_AddRefs(value));
*aResult=value.get();
NS_IF_ADDREF(*aResult);
returnNS_OK;
}
示例:
#include"nsIGenericFactory.h"
#defineSAMPLE_CID/


{0x777f7150,0x4a2b,0x4301,/


{0xad,0x10,0x5e,0xab,0x25,0xb3,0x22,0xaa}}
classSample:publicnsISupports


{
public:
Sample();
virtual~Sample();
NS_DECL_ISUPPORTS
};
Sample::Sample()


{
//note:innewerversionsofGecko(1.3orlater)
//youdon’thavetodothis:
NS_INIT_ISUPPORTS();
}
Sample::~Sample()


{
}
NS_IMPL_ISUPPORTS(Sample,nsISupports);
NS_GENERIC_FACTORY_CONSTRUCTOR(Sample);

staticconstnsModuleComponentInfocomponents[]=


{


{"PrettyClassName",
SAMPLE_CID,
"@company.com/sample"
SampleConstructor
}
};
NS_IMPL_NSGETMODULE(nsSampleModule,components)