XPCOM组件开发

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



你可能感兴趣的:(C++,c,mozilla,thunderbird,XPCOM)