XPCOM LINUX下的组件开发技术 COM技术作为微软推行的一种组件技术,在WINDOWS平台站有重要地位,在模块重用,跨语言通信等方面都能见到其身影。但今天给我要介绍的是LINUX下的COM实现----XPCOM,这是MOZILLA浏览器项目中所使用的基本技术,我们可以用C++制作XPCOM组件,在C++客户程序或MOZILLA浏览器中通过JAVASCRIPT脚本来调用组件,从而实现软件模块的复用。 1、 配置XPCOM的开发环境。 首先到MOZILLA的FTP下载Gecko-sdk包,这是XPCOM的开发包,MOZILLA的源码中也包括该SDK。解压该tgz包,可以看到生成大约十多个目录: /sdk/gecko-sdk/ /sdk/gecko-sdk/xpcom/bin /sdk/gecko-sdk/xpcom/idl /sdk/gecko-sdk/xpcom/include /sdk/gecko-sdk/nspr ...... 这里说明一下其中的一些基本部分。 /sdk/gecko-sdk/xpcom/bin下主要包含了一些文件: xpidl:这是idl编译器,用以根据idl产生c++头文件或组件类型库文件. Regxpcom:这是组件注册工作,如果我们在MOZILLA浏览器中调用组件,其实不会用该工具。 Xpt-dump:类型库查看程序,用来查看.xpt文件中的组件信息。 libxpcomglue.a:这是XPCOM的基本库文件,在生成组件时将会被连接到我们的组件库中。 /sdk/gecko-sdk/xpcom/idl,该目录中包含了idl数据类型定义文件。 /sdk/gecko-sdk/xpcom/include,其中包含了制作XPCOM时所需要的基本的C++头文件。 /sdk/gecko-sdk中还包含了其它一引起目录,如/sdk/sdk/gecko-sdk/string/include,其中包含了XPCOM中常字符串类的C++头 文件,如果我们的组件中需要使用这些类,只需包含进必要的头文件及库文件即可。 2、 撰写idl文件。 这里要先用到一个uuidgen(LINUX下类似MS GUIDGEN的一个命令行程序)用以产生组件的uuid, 我们将其输出先重定向到一个文本中,呆会儿即可使用,这里我们举一个简单的例子,来演示组件的生成过程。 Idl文件如下: //filename: nsIMyCom.idl //begin idl -------------------------------------- #include "nsISupports.idl" [scriptable, uuid(5217115e-11fe-4d01-966d-9b27ffda6498)] interface nsIMyCom:nsISupports { void Hello(in string in_str, [retval] out string out_str); }; //end idl----------------------------------------- 好了,该组件很简单,只有一个接口,并且也只有一个方法,该方法有一个字符串输入参数in_str,并且有一个字符串返回值out_str。 3、编译该idl文件,并完成该组件对应的C++实现。 /sdk/gecko-sdk/xpcom/bin/xpidl -I/sdk/gecko-sdk/xpcom/bin/idl -m header nsIMyCom.idl 如果没有错误,这时在当前目录下将会生成一个nsIMyCom.h文件,该文件是idl编译器对应上面的idl文件所生成的c++头文件。 下面是编译器生成的nsIMyCom.h文件内容: //-------------------------------------------------------- #ifndef __gen_nsIMyCom_h__ #define __gen_nsIMyCom_h__ #ifndef __gen_nsISupports_h__ #include "nsISupports.h" #endif /* For IDL files that don''''t want to include root IDL files. */ #ifndef NS_NO_VTABLE #define NS_NO_VTABLE #endif /* starting interface: nsIMyCom */ #define NS_IMYCOM_IID_STR "5217115e-22fe-4d01-966d-9b27ffda6498" #define NS_IMYCOM_IID / {0x5217115e, 0x22fe, 0x4d01, / { 0x96, 0x6d, 0x9b, 0x27, 0xff, 0xda, 0x64, 0x98 }} class NS_NO_VTABLE nsIMyCom : public nsISupports { public: NS_DEFINE_STATIC_IID_ACCESSOR(NS_IMYCOM_IID) /* void Hello (in string in_str, [retval] out string out_str); */ NS_IMETHOD Hello(const char *in_str, char **out_str) = 0; }; /* Use this macro when declaring classes that implement this interface. */ #define NS_DECL_NSIMYCOM / NS_IMETHOD Hello(const char *in_str, char **out_str); /* Use this macro to declare functions that forward the behavior of this interface to another object. */ #define NS_FORWARD_NSIMYCOM(_to) / NS_IMETHOD Hello(const char *in_str, char **out_str) { return _to Hello(in_str, out_str); } /* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */ #define NS_FORWARD_SAFE_NSIMYCOM(_to) / [1] [2] [3] [4] 下一页 [C语言系列]C# 和 Linux 时间戳转换 [Web开发]PHP flock文件锁介绍 [Web开发]flock() Linux下的文件锁 [电脑应用]Linux下的六个免费的虚拟主机管理系统介绍 [电脑应用]Linux数据库大比拚 [操作系统]在Windows中玩转Linux操作系统 [办公软件]在RedHat Linux 9里安装gaim0.80 [办公软件]掌握 Linux 调试技术 [办公软件]理解 Linux 配置文件 [聊天工具]Real10 & Xpdf installation on Linux Box
|