最近接手一个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添加扩展就和前面的没什么区别了,我也就不阐述了。