最近接手一个Thunderbird扩展的活,要求用XPCOM组件完成主要逻辑功能,查了一些资料发现这方面中文资料少之又少,觉得一个blog倒是可以用来入门: Phinecos(洞庭散人) 专注于开源技术的研究与应用 基于Mozilla平台的扩展开发(续)----XPCOM组件篇 ,后来才发现这个太旧了,现在换到高版本这篇文章自然也就不能跑成功了,昨天终于自己跑通了一个扩展,就是觉得太不简单了,期间也发现了很多还需要改进的地方,先说说开发过程吧!
功能目标 :
组件要实现的功能非常简单,就只提供一个做加法的接口供客户调用。
long Add(in long a, in long b);
然后在扩展中调用这个加法接口
准备:
1、SDK:http://ftp.mozilla.org/pub/mozilla.org/xulrunner/releases/24.0b3/sdk/
2、Thunderbird 24.3.0
3、VS2008
4、python 2.7。刚开始使用的最新的python,好像是3.3吧,后面使用一直有错误,后来换成这个版本一下就通过,还不清楚是什么原因。
开始:
1、C盘目录下新建idl文件(目录随意,到时候自己能找到就行),命名IMyComponent.idl,GUID使用VS自带工具
#include "nsISupports.idl" [scriptable,uuid(8CE2C123-8386-44EC-AACB-04D8EAFF58B5)] interface IMyComponent : nsISupports { long Add(in long a , in long b); };
2、安装python并添加环境变量,将下载的SDK包(xulrunner24.0b3)解压到C:\下,命令行进入xulrunner-sdk\sdk\bin目录,
python header.py --cachedir=./cache -I ..\..\idl -o MyComponent.h c:\IMyComponent.idl python typelib.py --cachedir=./cache -I ..\..\idl -o MyComponent.xpt c:\IMyComponent.idl
将会在xulrunner-sdk\sdk\bin目录中产生MyComponent.h和MyComponent.xpt两个文件。
3、新建MyComponentModule.cpp MyComponent.cpp和Component.h三个文件
/*Component.h*/ #pragma once #ifndef _MY_COMPONENT_H_ #define _MY_COMPONENT_H_ #include "MyComponent.h" #define MY_COMPONENT_CONTRACTID "@wangwei/XPCOMSample/MyComponent;1" #define MY_COMPONENT_CLASSNAME "A Simple XPCOM Sample" #define MY_COMPONENT_CID { 0xffd637e6, 0xaae4, 0x449c, { 0xba, 0x33, 0xa0, 0x49, 0x9c, 0xf6, 0xed, 0xc9 } } class MyComponent : public IMyComponent { public: NS_DECL_ISUPPORTS //声明ISuppotrs接口的方法,包含mRefCnt NS_DECL_IMYCOMPONENT //声明IMyComponent接口方法 MyComponent(void); ~MyComponent(void); }; #endif
/*MyComponent.cpp*/ #include "Component.h" MyComponent::MyComponent(void) { } MyComponent::~MyComponent(void) { } NS_IMETHODIMP MyComponent::Add(int32_t a, int32_t b, int32_t *_retval) { *_retval = a + b; return NS_OK; } //NS_IMPL_ISUPPORTSn 为指定类实现nsISupports,此类有n个接口 NS_IMPL_ISUPPORTS1(MyComponent,IMyComponent)
/*MyComponentModule.cpp*/ #include "mozilla/ModuleUtils.h" #include "nsIClassInfoImpl.h" #include "Component.h" NS_GENERIC_FACTORY_CONSTRUCTOR(MyComponent) NS_DEFINE_NAMED_CID(MY_COMPONENT_CID); static const mozilla::Module::CIDEntry kSampleCIDs[] = { { &kMY_COMPONENT_CID,false,nullptr, MyComponentConstructor}, { nullptr } }; static const mozilla::Module::ContractIDEntry kSampleContracts[] = { { MY_COMPONENT_CONTRACTID, &kMY_COMPONENT_CID }, { nullptr } }; static const mozilla::Module::CategoryEntry kSampleCategories[] = { {"my-category", "my-key", MY_COMPONENT_CONTRACTID }, { nullptr } }; static const mozilla::Module kSampleModule = { mozilla::Module::kVersion, kSampleCIDs, kSampleContracts, kSampleCategories }; NSMODULE_DEFN(nsSampleModule) = &kSampleModule; NS_IMPL_MOZILLA192_NSGETMODULE(&kSampleModule)
VS2008新建DLL工程,将上面的文件添加到工程中,
1、 工具-选项-项目和解决方案-vc++目录-包含文件 中添加C:\xulrunner-sdk\include
2、 工具-选项-项目和解决方案-vc++目录-库文件中添加C:\xulrunner-sdk\lib
3、 工程属性连接器-输入-附加依赖项中添加,mozalloc.lib nss3.lib xpcomglue_s_nomozalloc.lib xpcomglue.lib xul.lib
4、 工程属性C/C++-预处理器-预处理器定义中添加XPCOM_GLUE XP_WIN XP_WIN32
编译成MyComponent.dll,这样一个XPCOM组件就开发完成。后面的thunderbird添加扩展就和前面的没什么区别了,我也就不阐述了。