xpcom :创建xpcom component ,old document,windows下

xpcom 组件开发

在翻译xpcom指南系列时,发现根据此系列文章来创建一个能够运行的xpcom组件有不小的难度。因为此系列文章是在2005年发表的(当时 Firefox还没有进入版本大战),虽然此系列文章后来也随着Firefox的升级持续在进行更新,但是仍然有很多地方没能改变。 当我们在阅读这系列文章时,往往很难按照文章写出可以运行的代码(甚至是能够编译通过的)。 下面把一些可能问题列在下面:

[ 注:本人实现了一个xpcom组件向导,用于简化xpcom 组件的一些创建工作。]

1. 组件注册

组件注册的方式从Gecko 2.0就发生了变化(参见官方文章,XPCOM changes in Gecko 2.0),你再也找不到文章里提到的Regxpcom程序了,现在你不需要运行什么特别的程序来注册组件,nsModuleComponentInfo结构体也换成了nsModuleComponentInfo。 你只需要在chrome.manifest文件里加入组件的相关信息(接口,二进制库的位置)或者加入 组件的manifest文件指向,Gecko在加载的时候,会根据chrome.manifest文件自动对xpcom组件进行注册。 chrome.manifest 文件内容如下所示:

chrome.manifest

[plain] view plain copy
  1. content    test    chrome/content/   
  2. locale     test    en-US    chrome/locale/en-US/   
  3. skin       test    classic/1.0    chrome/skin/   
  4. manifest   components/yuAccess.manifest  


chrome.manifest文件里的manifest行,描述了yuAccess组件的相关信息,这里是告诉Gecko,yuAccess组件的信息放置在目录components下的yuAccess.manifest文件里。

yuAccess.manifest文件的内容如下所示:

[plain] view plain copy
  1. binary-component yuAccess.dll  
  2. interfaces yuIAccess.xpt  
  3.   
  4. category profile-after-change yuAccess @yutools.com/yuIAccess;1  

chrome.manifest文件的详细格式,参见官方文档“ Chrome Registration”。

2. 组件作为服务

组件作为服务的步骤也发生了变化,变得更加简单,你只需要在组件的manifest文件里加入下面指令:

[plain] view plain copy
  1. category profile-after-change yuAccess @yutools.com/yuIAccess;1  

3. XPIDL Code Generation

通过IDL生成.h和.xpt文件的程序也从可执行程序换成了python脚本。你可以在XPCOM_SDK的“\sdk\bin\”路径下找到相应的脚本,命令执行例子如下:

[plain] view plain copy
  1. python %XPCOM_SDK%\sdk\bin\typelib.py --cachedir=./cache -I %XPCOM_SDK%\idl -o ../../bin/components/yuIAccess.xpt yuIAccess.idl  
  2. python %XPCOM_SDK%\sdk\bin\header.py --cachedir=./cache -I %XPCOM_SDK%\idl -o ../include/yuIAccess.h yuIAcce 

创建windows下的第一个C++ XPCOM组件

本文翻译自 Creating a C++ XPCOM component(链接为http://www.iosart.com/firefox/xpcom/),并尝试创建自己的第一个XPCOM工程

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

本文涉及的sdk和源代码可以从我的资源里面下载。

创建组件

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

2. 为主接口创建GUID:

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

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

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

  1. #include "nsISupports.idl"  
  2. [scriptable, uuid(你的GUID)]  
  3. interface IMyComponent : nsISupports  
  4. {  
  5.   long Add(in long a, in long b);  
  6. };  

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

a. 使用Gecko SDK中的xpidl 工具. xpidl在Gecko SDK主目录的bin/下(注意运行前需要将glib-1.2.dll,libIDL-0.6.dll拷贝到bin目录下,这些库包含在buildtools\windows\bin\x86下。)

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

c. xpidl -m header -I_DIR_ IMyComponent.idl (IMyComponent.h最好拷贝到bin目录下面,否则填写完整路径,会创建IMyComponent.h)

d. xpidl -m typelib -I_DIR_ IMyComponent.idl (同上,会创建IMyComponent.xpt)

e. 生成的IMyComponent.h,IMyComponent.xpt在与.idl同一目录下目录下。

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

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

  1. #pragma once  
  2.   
  3. #ifndef _MY_COMPONENT_H_  
  4. #define _MY_COMPONENT_H_  
  5. //<span style="color:rgb(51,51,51);">加入 #include "IMyComponent.h" 以包含接口的定义</span>  
  6. #include "IMyComponent.h"  
  7. #define MY_COMPONENT_CONTRACTID "@mydomain.com/XPCOMSample/MyComponent;1"<span style="white-space:pre;">    </span>//契约ID  
  8. #define MY_COMPONENT_CLASSNAME "A Simple XPCOM Sample"<span style="white-space:pre;">               </span>  
  9. #define MY_COMPONENT_CID  {0xb7b04070, 0x45fc, 0x4635,{ 0xb2, 0x19, 0x7a, 0x17, 0x2f, 0x80, 0x6b, 0xee } }  
  10.   
  11.   
  12. class MyComponent:public IMyComponent  
  13. {  
  14. public:  
  15.     NS_DECL_ISUPPORTS  
  16.         NS_DECL_IMYCOMPONENT  
  17.         MyComponent(void);  
  18.     ~MyComponent(void);  
  19. };  
  20. #endif  


7. MyComponent.cpp

  1. #include "MyComponent.h"  
  2.   
  3. NS_IMPL_ISUPPORTS1(MyComponent, IMyComponent)  
  4.   
  5. MyComponent::MyComponent(void)  
  6. {  
  7. }  
  8.   
  9. MyComponent::~MyComponent(void)  
  10. {  
  11. }  
  12.   
  13. NS_IMETHODIMP MyComponent::Add(PRInt32 a, PRInt32 b, PRInt32 *_retval)  
  14. {  
  15.     *_retval = a + b;  
  16.     return NS_OK;  
  17. }  


8. MyComponentModule.cpp

  1. #include "nsIGenericFactory.h"  
  2. #include "MyComponent.h"  
  3.   
  4. NS_GENERIC_FACTORY_CONSTRUCTOR(MyComponent)  
  5.   
  6. static nsModuleComponentInfo components[] =  
  7. {  
  8.     {  
  9.         MY_COMPONENT_CLASSNAME,  
  10.         MY_COMPONENT_CID,  
  11.         MY_COMPONENT_CONTRACTID,  
  12.         MyComponentConstructor,  
  13.     }  
  14. };  
  15.   
  16. NS_IMPL_NSGETMODELE("MyComponentsModule", components)  

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(Windows下cmd, Linux下tcsh, 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.7和1.8的SDK文件都不全,所以只能1.7和1.8都下载~

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

4. 注册新组件到Mozilla中

a. 拷贝 MyComponent.so/MyComponent.dll和IMyComponent.xpt 到Mozilla的components目录。在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 】

参考资料:

http://www.cnblogs.com/phinecos/archive/2008/04/25/1171614.html





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值