通用型XPCOM模块宏
宏 |
作用 |
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)用于给定对象的构造者
static const nsModuleComponentInfo components[] =


{


{ "Pretty Class Name",
CID,
CONTRACT_ID,
Constructor
},

.
}

工厂宏:
NS_GENERIC_FACTORY_CONSTRUCTOR(ConcreteClass)
常用实现宏
NS_IMPL_ISUPPORTS1(classname, interface1)
NS_IMPL_ISUPPORTSn(classname, interface1, …, interfacen)

声明宏:
class myEnumerator : public nsISimpleEnumerator


{
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)
return NS_ERROR_NULL_POINTER;
nsCOMPtr<nsISupports> value;
object->method(getter_AddRefs(value));
*aResult = value.get();
NS_IF_ADDREF(*aResult);
return NS_OK;
}

示例:
#include "nsIGenericFactory.h"
#define SAMPLE_CID \


{ 0x777f7150, 0x4a2b, 0x4301, \


{ 0xad, 0x10, 0x5e, 0xab, 0x25, 0xb3, 0x22, 0xaa}}
class Sample: public nsISupports


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


{
// note: in newer versions of Gecko (1.3 or later)
// you don’t have to do this:
NS_INIT_ISUPPORTS();
}
Sample::~Sample()


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

static const nsModuleComponentInfo components[] =


{


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

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
2006-06-02 Java开发环境搭建全过程(上)