写xpcom组件我们经常copy paste,因为xpcom组件的与业务无关的注册、QueryInterface代码都是基本固定的,
写了一个自动生成xpcom组件的template,这样就可以只关心核心业务,避免书写样板式的代码。
=begin
NOTICE:
Before use the code:
You should use command "gem install uuid" to install uuid gem for ruby
Once installed, create a uuid.state file by running command "uuid-setup"
=end
require 'uuid'
puts "please input the component interface name:"
component_interface_name = gets.chomp
puts "please input the component class name:"
class_name = gets.chomp
cid = "{#{UUID.new}}";
template = <<EOF
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cr = Components.results;
const nsISupports = Ci.nsISupports;
const #{component_interface_name} = Ci.#{component_interface_name};
const CLASS_ID = Components.ID("#{cid}");
const CLASS_NAME = "#{class_name}";
const CONTRACT_ID = "@ibm.com/#{class_name.downcase};1";
function #{class_name}(){
};
#{class_name}.prototype = {
QueryInterface: function(aIID){
if(!aIID.equals(#{component_interface_name}) &&
!aIID.equals(nsISupports))
throw Cr.NS_ERROR_NO_INTERFACE;
return this;
}
};
var #{class_name}Factory = {
createInstance: function(aOuter, aIID){
if(aOuter != null)
throw Cr.NS_ERROR_NO_AGGREGATION;
return (new #{class_name}()).QueryInterface(aIID);
}
};
var #{class_name}Module = {
registerSelf: function(aComMgr, aFileSpec, aLocation, aType){
aComMgr = aComMgr.QueryInterface(Ci.nsIComponentRegistrar);
aComMgr.registerFactoryLocation(CLASS_ID, CLASS_NAME, CONTRACT_ID, aFileSpec, aLocation, aType);
},
unregisterSelf: function(aComMgr, aLocation, aType){
aComMgr = aComMgr.QueryInterface(Ci.nsIComponentRegistrar);
aComMgr.unregisterFactoryLocation(CLASS_ID, aLocation);
},
getClassObject: function(aComMgr, aCID, aIID){
if(!aIID.equals(Ci.nsIFactory))
throw Cr.NS_ERROR_NO_IMPLEMENTED;
if(aCID.equals(CLASS_ID))
return #{class_name}Factory;
throw Cr.NS_ERROR_NO_INTERFACE;
},
canUnload: function(aComMgr){
return true;
}
};
function NSGetModule(aComMgr, aFileSpec){
return #{class_name}Module;
};
EOF
file_name = "#{class_name}.js"
File.open(file_name,"w") do |file|
file.puts template
end
生成idl文件:
=begin
NOTICE:
Before use the code:
You should use command "gem install uuid" to install uuid gem for ruby
Once installed, create a uuid.state file by running command "uuid-setup"
=end
require 'uuid'
puts "please input the component interface name:"
component_interface_name = gets.chomp
template = <<EOF
#include "nsISupports.idl"
[scriptable, uuid(#{UUID.new})]
interface #{component_interface_name} : nsISupports{
};
EOF
file_name = "#{component_interface_name}.idl"
File.open(file_name,"w") do |file|
file.puts template
end
分享到:
相关推荐
这是一本有关Gecko的书,Gecko是所有Mozilla品牌的软件及其衍生产品中使用的开源Web浏览器布局引擎,以及有关为基于Gecko的应用程序创建XPCOM组件的书。
- **第4章:教程——创建组件代码** 提供一个实际的例子,指导开发者完成一个简单的XPCOM组件。 #### 第1章:XPCOM简介 ##### XPCOM的概念 XPCOM(Cross Platform Component Object Model)是一种跨平台组件对象...
该工具是用于xpcom组件开发的vc2010项目向导。 您可以使用此向导创建xpcom组件。 工具的羽毛:1.所有xpcom组件开发环境均已创建(适用于vc2010); 2.支持简单的UI; 3.支持壁虎17/18/19
这些示例可能会展示如何创建一个新的XPCom组件,如何暴露接口给其他组件调用,以及如何处理组件间的通信。 3. **头文件和库**:开发XPCom组件通常需要相关的头文件和库文件。这些文件包含了开发所需的接口定义和...
标题“xpcom descriptions”指的是与XPCOM(Cross Platform Component Object Model)相关的描述性文档,这是一个在Mozilla项目中广泛使用的组件系统,允许不同编程语言之间的交互。XPCOM是Firefox、Thunderbird等...
Buxom 是一个开源工具,它可以帮助开发者自动化地生成从 XPCOM 到 Bonobo 的静态桥接基础部分。Buxom 通过读取目标组件的 CORBA IDL 文件来生成桥接代码,这极大地简化了手动编写繁琐的适配器代码的过程。 使用 ...
在IT行业中,尤其是在软件开发领域,跨平台组件对象模型(XPCOM)是Mozilla基金会的开源项目,如Firefox浏览器所使用的底层技术之一。XPCOM允许开发者创建可重用的跨语言、跨平台的组件。当涉及到XPCOM组件间的交互...
XPCOM,全称为“Cross Platform Component Object Model”,是由Mozilla基金会开发的一种跨平台的组件对象模型,主要用于构建可扩展的网络应用程序,特别是Firefox浏览器和其他基于Gecko引擎的应用。这个技术允许...
JavaScript是XPCOM的一个重要接口,允许开发者用JS编写组件,与Firefox的内部系统进行深度集成。 在本文中,我们将深入探讨如何使用JavaScript来创建XPCOM实例。首先,理解XPCOM的基础概念至关重要。XPCOM是基于COM...
Gecko SDK 是一个开发工具包,专门为构建和操作XPCOM组件而设计。 **1. Gecko SDK 的组成部分** - **appcomps**: 这个库包含了应用程序级别的组件,如浏览器或邮件客户端的特定功能。开发者可以利用这些组件来构建...
《创造XPCOM组件》是一本面向C++开发者的指南,旨在教授如何为基于Gecko的应用程序创建XPCOM组件。XPCOM(Cross Platform Component Object Model)是Mozilla基金会开发的一种跨平台组件模型,它允许不同语言之间的...
为了开发一个XPCom组件,我们需要在Visual Studio 2005环境下进行配置。安装好VS2005后,创建一个新的C++项目,并包含必要的XPCom库。这些库包括nsIComponentRegistrar、nsISupports等接口,它们提供了注册组件、...
4. **NSPR支持**:XPCom依赖于NSPR(Netscape Portable Runtime),一个跨平台的低级库,负责线程、内存管理、网络和I/O操作。NSPR为XPCom提供了底层的多线程和异步功能。 5. **JS-XPCOM桥接**:JavaScript可以通过...
`xpcom`是Mozilla开发的一个跨平台组件接口,它允许不同编程语言之间进行交互,并在Firefox等开源浏览器中扮演着重要角色。 描述中提到"xpcom资料太少,一个可完整编译工程",这表明该压缩包可能包含了一个完整的、...
每个XPCOM组件都需要一个全局唯一的标识符(GUID)。可以通过执行`uuidgen`命令来生成一个随机的GUID。例如: ```sh $ uuidgen ``` 生成的GUID将用于后续步骤中的组件定义。 ##### 3. 编写接口定义文件 使用`*....
XULRunner是Mozilla Firefox浏览器的基础,它提供了一个运行时环境,支持使用XML(XUL)语言创建用户界面,并通过XPCom组件实现底层功能。开发者需要使用C++来编写XPCom组件,这个组件会包含创建系统托盘图标、添加...
XPCom(Cross Platform Component Object Model)是Mozilla基金会开源项目中的一个核心技术,它提供了一种跨平台的组件模型,允许不同编程语言之间进行交互。XPCom使得开发者能够创建可重用的软件组件,这些组件可以...
3. **XPCOM服务**:在XPCOM中,服务是一种特殊的组件,它们是单例的,即在应用程序的整个生命周期中只存在一个实例。通过XPCOM服务,开发者可以访问和操纵Mozilla应用中的各种功能,如网络请求、数据库操作等。 4. ...
XPCom(eXtensible Platform Components)是Mozilla基金会开发的一个组件系统,主要用于跨进程通信和实现组件间的交互。这个“xpcom descriptions 3”可能指的是关于XPCom的第三版详细说明或者教程,特别针对Visual ...