Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2287|回复: 0
打印 上一主题 下一主题

Xul调用Xpcom组件完整例子---gecko-sdk-win32-msvc-1.8.0.4.zip

[复制链接]

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
跳转到指定楼层
楼主
发表于 2016-4-25 11:48:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Xul调用Xpcom组件完整例子
这几天在研究Xul ,调试通过了一个Xul做界面,通过js调用c++开发的xpcom的例子。感觉步骤比较繁杂,以前没有用过VS200X工具,配置环境也颇费了点时间,所以就把整个开发过程作了一个记录。
总体过程分三步:
1,开发xpcom;
2,写xul界面;
3,调用编译好的xpcom组件。
下面详写每一步详细步骤。
第一步:使用c++开发xpcom。工具是visual studio 2005
1, 首先下载Gecko SDK,这个是xpcom的开发包,开发xpcom组件时要用到其中的资源:下载地址:
2, 另外Gecko SDK中需要用到wintools.zip中的资源。
   下载地址:http://ftp.mozilla.org/pub/mozilla.org/mozilla/source/wintools.zip
3, 将wintools.zip解压,从wintools\buildtools\windows\bin\x86目录中复制glib-1.2.dll 、libIDL-0.6.dll ,拷贝到\gecko-sdk\bin目录下。
4,  创建idl。(例如:comp.idl,内容如下
#include "nsISupports.idl" [scriptable, uuid(A037CC48-2EF0-47ad-B59E-ACCC4B89AD2B)]interface ISpecialThing : nsISupports{  long add(in long a, in long b);  attribute AString name;};注意:idl中的uuid需要修改一下,在vc++的菜单里面有一个工具可以生成guid.工具-〉创建guid,使用生成的这个guid填入idl文件中的uuid的括号里面。如图:file:///C:/Users/HECHEN~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
5, 建立组件。
5.1  使用Gecko SDK编译idl文件。因为本人一向对路径问题头疼,所以直接将idl文件放到了\gecko-sdk\bin目录下。然后在“开始”—〉“运行”中输入cmd,打开命令行窗口后执行命令:xpidl.exe -m header-I..\idl comp.idl  执行后生成comp.h文件;再执行命令:xpidl.exe -m typelib -I..\idlcomp.idl  执行后生成comp.xpt文件.
file:///C:/Users/HECHEN~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg
5.2   建立一个头文件 comp-impl.h
#ifndef __SPECIALTHING_IMPL_H__#define __SPECIALTHING_IMPL_H__ #include "comp.h"#include "nsStringAPI.h" #define SPECIALTHING_CONTRACTID "@starkravingfinkle.org/specialthing;1"#define SPECIALTHING_CLASSNAME "SpecialThing"#define SPECIALTHING_CID { 0x245626, 0x5cc1, 0x11db, { 0x96, 0x73, 0x0, 0xe0, 0x81, 0x61, 0x16, 0x5f } } class CSpecialThing : public ISpecialThing{public:        NS_DECL_ISUPPORTS        NS_DECL_ISPECIALTHING         CSpecialThing(); private:        ~CSpecialThing(); protected:        /* additional members */        nsString mName;}; #endif
5.3建立一个cpp文件:comp-impl.cpp
#include "comp-impl.h" NS_IMPL_ISUPPORTS1(CSpecialThing, ISpecialThing) CSpecialThing::CSpecialThing(){        /* member initializers and constructor code */        mName.Assign(L"Default Name");} CSpecialThing::~CSpecialThing(){        /* destructor code */} /* attribute AString name; */NS_IMETHODIMP CSpecialThing::GetName(nsAString & aName){        aName.Assign(mName);        return NS_OK;}NS_IMETHODIMP CSpecialThing::SetName(const nsAString & aName){        mName.Assign(aName);        return NS_OK;} /* long add (in long a, in long b); */NS_IMETHODIMP CSpecialThing::Add(PRInt32 a, PRInt32 b, PRInt32 *_retval){        *_retval = a + b;        return NS_OK;}
5.3建立模块代码。comp-module.cpp
#include "nsIGenericFactory.h"
#include "comp-impl.h"
#include "stdafx.h"
NS_GENERIC_FACTORY_CONSTRUCTOR(CSpecialThing)
static nsModuleComponentInfo components[] =
{
    {
       SPECIALTHING_CLASSNAME,
       SPECIALTHING_CID,
       SPECIALTHING_CONTRACTID,
       CSpecialThingConstructor,
    }
};
NS_IMPL_NSGETMODULE("SpecialThingsModule",components)
6   建立dll工程
打开vs2005后,“新建”〉“项目”,选择“其他语言”中的visual c++ ,然后选择“MFC DLL”,填写工程名称并选择路径。
file:///C:/Users/HECHEN~1/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg
7   配置工程环境
7.1  加入Include文件夹。工程->属性-> 配置属性->C/C++ -> 常规 选项的“附加包含目录“中加入要包含的头文件的目录\gecko-sdk\include。例如:D:\gecko-sdk\include。
7.2  在工程属性设置的选项卡里面实现库的引用。
7.3  (1)工程->属性->配置属性->链接器-> 常规 选项里面进行下列设置:
  “附加库目录“设置库文件所在路径..\gecko-sdk\lib;链接库依赖项设置为Yes;使用库依赖项输入设置为Yes;
file:///C:/Users/HECHEN~1/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg
在工程->属性->配置属性->链接器-> 输入->附加依赖项中添加库的名称(nspr4.lib xpcom.lib xpcomglue_s.lib);多个库名称以空格隔开。
file:///C:/Users/HECHEN~1/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg
7.4
工程->属性-> 配置属性->C/C++ -> 预处理器 修改预处理器定义,添加 XP_WIN;XP_WIN32
file:///C:/Users/HECHEN~1/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg
7.5工程->属性-> 配置属性-> C/C++ ->预编译头-〉创建使用预编译头 改为不使用预编译头。
7.6为避免运行时报错:“error PRJ0003 : 生成 cmd.exe 时出错” 。
  “工具”-〉“选项”->“项目和解决方案”->“VC目录“下添加
$(SystemRoot)\System32
$(SystemRoot)
$(SystemRoot)\System32\wbem
file:///C:/Users/HECHEN~1/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg
8,将刚才建立的组件文件comp.h,comp-impl.h,comp-impl.cpp,comp-module.cpp添加到工程中。编译成功后开发xpcom组件的步骤完成。
第二步:开发xul界面,步骤在mozilla网站写的很清楚
第三步用自己写的xul界面调用xpom组件:
1,部署组件:将第二步编译成功生成的dll文件和第一步编译idl文件生成的comp.xpt文件一同拷贝到自己的xul工程目录的components目录下(没有的话自己建一个,components目录和application.ini同级)。
2,更新注册:在你的 xul应用程序目录/application.ini中,找到BuildID后将值修改,改为原来的数字加1或加几都可以。
3,写javascript调用
这里有一个非常简单的只有一个按钮的mail.xul,其中红色字体部分是javascript调用组件的代码。
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/"type="text/css"?>
<window id="main" title="My App"width="300" height="300"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"xmlns:html="http://www.w3.org/1999/xhtml"
  
   persist="screenX screenYwidth height sizemode">
<vbox flex="1">
<hboxid="aContainer">
<html:table>
<html:tr><html:td><buttonlabel="Normal"id="okbutton"  />
<script>
function buttonPressed(event){
  //alert('Buttonwas pressed!');
  try {
    const cid ="@starkravingfinkle.org/specialthing;1";
    var obj =Components.classes[cid].createInstance();
    obj =obj.QueryInterface(Components.interfaces.ISpecialThing);
  }
  catch (err) {
    alert(err);
    return;
  }
  var res =obj.add(3, 4);
  alert('3+4 = ' +res);
  var name =obj.name;
  alert('Name = ' +name);
  obj.name = 'NewName';
  name = obj.name;
  alert('Name = ' +name);
}
var button =document.getElementById("okbutton");
button.addEventListener('command', buttonPressed, true);
</script>
</html:td><html:td>ok</html:td></html:tr>
</html:table>
</hbox>
</vbox>
</window>
运行结果如下
file:///C:/Users/HECHEN~1/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg
开发xpcom.rar (227.07 KB, 下载次数: 0)

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-4-20 07:56 , Processed in 0.062342 second(s), 22 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表