2007年6月11日星期一

创建C++ XPCOM组件


本文翻译自 Creating a C++ XPCOM component,结合自己学习过程添加部分注意事项,希望对初学XPCOM的朋友有所帮助,并多多交流。

关于

这是一个step-by-step的入门教程,讲述在LinuxWindows下创建,构建和注册一个XPCOM 组件的过程。

下载

本文涉及的源代码可以从这里下载。

创建组件

1. 下载 gecko-sdk-i586-pc-msvc-1.7.zip,解压到本地。、


2.
为主接口创建GUID:

a. Windows下用guidgen (Visual Studio 2003/2005 工具->创建GUID)

b. Linux 下用uuidgen

3. 创建接口定义 - IMyComponent.idl

a. 使用以下模板,添加方法和属性给接口。
b.
填入刚生成的GUID

#include "nsISupports.idl"
[scriptable, uuid(
你刚生成的GUID)]
interface IMyComponent : nsISupports
{
long Add(in long a, in long b);
};

4. 用接口定义文件生成接口头文件和类型库(typelib)文件

a. 使用Gecko SDK中的xpidl 工具. xpidlGecko SDK主目录的bin/

b. 将下列命令中的_DIR_替换为Gecko SDK主目录下的idl目录路径

c. xpidl -m header -I_DIR_ IMyComponent.idl 将会创建 IMyComponent.h

d. xpidl -m typelib -I_DIR_ IMyComponent.idl 将会创建 IMyComponent.xpt

e. 注意运行xpidl需要glib-1.2.dlllibIDL-0.6.dll,这些库包含在wintools.zip 中,解压后在gecko_wintools\buildtools\windows\bin\x86下。

f. 生成的IMyComponent.h,IMyComponent.xpt在当前目录下。

5. 接口头文件IMyComponent.h中包含了模板,用于构建你自己组件头和实现文件。你可以拷贝粘帖这些模板,只要修改组件名就可以了。

6. 创建你的组件的头文件 -MyComponent.h

a. 首先加入

#ifndef _MY_COMPONENT_H_
#define _MY_COMPONENT_H_
...
#endif

b. 加入 #include "IMyComponent.h" 以包含接口的定义。
c.
为组件创建一个GUID. 注意是这种格式:{ 0x9d8eb88b, 0x30ce, 0x46e0, { 0x81, 0xb2, 0xca, 0xb1, 0x5a, 0xc6, 0xba, 0xc7 } }

d. 加入下列代码,它们主要用于定义你的组件名,contract IDGUID

#define MY_COMPONENT_CONTRACTID "@mydomain.com/XPCOMSample/MyComponent;1"
#define MY_COMPONENT_CLASSNAME "A Simple XPCOM Sample"
#define MY_COMPONENT_CID
你组件的GUID

e. IMyComponet.h上拷贝头文件的模板(以/* Header file */开始,到 /* Implementation file */结束)
f.
用你的组件名替换所有的_MYCLASS_

7. 创建你的组件的实现文件 - MyComponent.cpp

a. 加入#include "MyComponent.h"以包含你自己的组件定义
b.
IMyComponent.h中拷贝实现模板(以 /* Implementation file */开头到#endif
c.
用你的组件名替换所有的_MY_CLASS_
d.
加入实现代码。

8. 创建你的模块定义文件 -MyComponentModule.cpp

a. 添加#include "nsIGenericFactory.h" 用以包含Mozilla GenericFactory的定义
b.
添加#include "MyComponent.h" 以包含你的组件定义
c.
添加 NS_GENERIC_FACTORY_CONSTRUCTOR(MyComponent),以定义你组件的构造函数。注意:MyComponent是你的组件名。
d.
添加

static nsModuleComponentInfo components[] =

{

{

MY_COMPONENT_CLASSNAME,
MY_COMPONENT_CID,
MY_COMPONENT_CONTRACTID,
MyComponentConstructor, //
注意将MyComponent替换为你的组件名。

}

};

以定义类名,contract ID和你组件的GUID.
e.
添加 NS_IMPL_NSGETMODULE("MyComponentsModule", components)以输出上述所有信息到Mozilla.

9. 创建makefiles或者工程

a. 你可以根据例子 里提供的模板去定制你的makefile.

b. 或者,你可以创建一个Visual C++工程,进行一些简单的设置就可以了。

从例子程序构建

1. 这里 下载示例代码,解压到本地。

2. 编辑makefile

a. makefile位于示例代码的src目录下。

b. Makefile用于Linux, MyComponent.mak用于Windows.

c. 编辑makefile, 改变 GECKO_SDK_PATH 变量指向你的Gecko SDK 目录。

3. 构建示例程序

a. 打开命令行或shell(Windowscmd, Linuxtcsh, bash)

b. 切换到示例代码的目录。

c. Linux下键入make, MyComponent.so将被创建。

d. Windows下键入 nmake /f MyComponent.mak. Debug\MyComponent.dll将创建, 注意,如果提示缺少nspr4.lib, plc4.lib, plds4.lib, 下载gecko-sdk-i586-pc-msvc-1.8b1.zip解压后在lib文件夹下。Mozilla的文件太乱了,1.71.8SDK文件都不全,所以只能1.71.8都下载~

e. 或者用 nmake /f "MyComponent.mak" CFG="MyComponent - Win32 Release" 创建release版的,Release\MyComponent.dll 将被创建

4. 注册新组件到Mozilla

a. 拷贝 MyComponent.so/MyComponent.dllIMyComponent.xpt Mozillacomponents目录。在Windows下这个目录一般在 C:\Program Files\Mozilla Firefox\components. Linux~/firefox/components (或~/mozilla/components

b. 运行Gecko SDK 提供的regxpcom注册新组件,你可以用 regxpcom -x components路径 来注册,或者在Mozilla安装路径下创建.autoreg,让它自动注册。

c. 删除Mozilla配置目录下的 xpti.dat compreg.dat. Windows配置目录在C:\Documents and Settings\USERNAME\Application Data\Mozilla\Firefox\Profiles\default.??? Linux下的在~/.mozilla/firefox/default.??? 下。

5. 测试新组件

a. 重启Mozilla Firefox

b. 打开 示例代码里的MyComponentsTest.html, "GO"按钮

c. 如果一切正常,你可以看到 “3+4=7”.

链接和资源:

1. IBM developerWorks - XPCOM Overview[第1部分][第2部分][第3部分][第4部分][第5部分]

2. Doug Turner创建XPCOM组件

3. 为Mozilla创建应用程序 【第八章-XPCOM



1 条评论:

匿名 说...

你好:
我是Elanso的vivian,很高兴认识你!
在yeeyan上看到你翻译的文章,非常好,特意写信邀请你参加我们网站正在进行的“译王争霸赛”活动!
这个活动的最高奖金为10000人民币,除此之外,您还会成为我们合作翻译公司的签约译员。
如果您有时间,可以翻译些新的文章参赛。或者直接把您从前翻译的文章“自荐自译”也可以~!
网站地址:www.elanso.com
活动地址:http://www.elanso.com/Common/TranslatorContest.aspx
现有兼职翻译项目:http://project.elanso.com/

真诚的欢迎您这样优秀的译员~!

Elanso Vivian