zoukankan      html  css  js  c++  java
  • Windows下xpcom组件开发

    一、基本概念

       XPCOM是一个跨平台组件模型,它的全称为Cross Platform Component Object Module。XPCOM实现了一个框架(framework),这个框架中,它允许开发者打破单一整体的软件项目,而分解为多个更小的模块化碎片(pieces),这些碎片也即组件(components)。XPCOM组件开发类似于Microsoft COM组件,有COM基础者,很容易学习XPCOM。
    二、搭建开发环境
      XPCOM开发需要Gecko SDK ,由于Gecko SDK包含在XULRunner中,因此只要下载XULRunner SDK就可以进行开发,下面仍然以XULRunner 2.0为开发环境。
    三、创建第一个XPCOM组件
      1、新建ISampleComponents.idl文件,输入以下代码:
          
    1 #include "nsISupports.idl"
    2
    3 [scriptable, uuid(7F35DE58-C0E3-4480-9CA0-EB2A83F1B9CE)]
    4 interface ISampleComponents : nsISupports
    5 {
    6 long Sum(in long aFirst, in long aSecond);
    7 };

         其中,uuid是由是一个通过特定算法产生的二进制长度为128位的数字标识符,用于指示接口的唯一性,可以有Microsoft GUID工具产生,nsISupports此接口是最基本的一个接口,我们继承这个接口,添加一个Sum方法两个long类型参数,返回类型也为long。
      2、编译ISampleComponents.idl文件
        将此文件复制到XULRunner2.0\bin目录中,在命令行中进入此目录,键入命令如下:
    D:\xulrunner2.0\bin>xpidl -m header -I "..\idl" ISampleComponents.idl
    D:\xulrunner2.0\bin>xpidl -m typelib -I "..\idl" ISampleComponents.idl
        如果两行命令均无错误则会创建ISampleComponents.h和ISampleComponents.xpt两个文件。
      3、使用VS2010开发组件
        (1)新建一个一个win32 DLL空项目,并将第二步中的三个文件放到项目目录中,并将ISampleComponents.h添加到项目中。
        (2)然后新建SampleComponents.h和SampleComponents.cpp两个文件,内容如下:
            
    SampleComponents.h
     1 /*SampleComponents.h*/
    2 #pragma once
    3 #ifndef _SAMPLE_COMPONENTS_H_
    4 #define _SAMPLE_COMPONENTS_H_
    5
    6 #include "ISampleComponents.h"
    7
    8 #define SAMPLE_COMPONENTS_CONTRACTID "@lintclr.com/ISampleComponents;1"
    9 #define SAMPLE_COMPONENTS_CID { 0x7f35de58, 0xc0e3, 0x4480, { 0x9c, 0xa0, 0xeb, 0x2a, 0x83, 0xf1, 0xb9, 0xce } };
    10
    11 class SampleComponents : public ISampleComponents
    12 {
    13 public:
    14 NS_DECL_ISUPPORTS
    15 NS_DECL_ISAMPLECOMPONENTS
    16
    17 SampleComponents();
    18
    19 private:
    20 ~SampleComponents();
    21 };
    22
    23 #endif
           
    SampleComponents.cpp
     1 /*SampleComponents.cpp*/
    2 #include "SampleComponents.h"
    3
    4 NS_IMPL_ISUPPORTS1(SampleComponents, ISampleComponents)
    5
    6 SampleComponents::SampleComponents()
    7 {
    8
    9 }
    10
    11 SampleComponents::~SampleComponents()
    12 {
    13
    14 }
    15
    16 NS_IMETHODIMP SampleComponents::Sum(PRInt32 aFirst, PRInt32 aSecond, PRInt32 *_retval NS_OUTPARAM)
    17 {
    18 *_retval = aFirst + aSecond;
    19 return NS_OK;
    20 }

         (4)新建SampleComponentsModule.cpp文件,并键入如下代码:     

    SampleComponentsModule.cpp
     1 #include "mozilla/ModuleUtils.h"
    2 #include"nsIClassInfoImpl.h"
    3 #include"SampleComponents.h"
    4
    5 NS_GENERIC_FACTORY_CONSTRUCTOR(SampleComponents)
    6
    7 NS_DEFINE_NAMED_CID(SAMPLE_COMPONENTS_CID);
    8
    9 static const mozilla::Module::CIDEntry kSampleComCIDs[] = {
    10 { &kSAMPLE_COMPONENTS_CID, false, NULL, SampleComponentsConstructor },
    11 { NULL }
    12 };
    13
    14 static const mozilla::Module::ContractIDEntry kSampleContracts[] = {
    15 { SAMPLE_COMPONENTS_CONTRACTID, &kSAMPLE_COMPONENTS_CID },
    16 { NULL }
    17 };
    18
    19 static const mozilla::Module::CategoryEntry kSampleCategories[] = {
    20 {"my-category", "my-key", SAMPLE_COMPONENTS_CONTRACTID },
    21 { NULL }
    22 };
    23
    24 static const mozilla::Module kSampleModule = {
    25 mozilla::Module::kVersion,
    26 kSampleComCIDs,
    27 kSampleContracts,
    28 kSampleCategories
    29 };
    30
    31 NSMODULE_DEFN(nsSampleModule) = &kSampleModule;
    32 NS_IMPL_MOZILLA192_NSGETMODULE(&kSampleModule)

         (5)配置编译选项,编译组件
            配置属性->VC++目录->附加包含目录:D:\xulrunner2.0\include;
            配置属性->VC++目录->库目录:D:\xulrunner2.0\lib;
            配置属性->C/C++->预处理器->预处理定义:XPCOM_GLUE 
                                                                      XP_WIN 
                                                                      XP_WIN32 
                                                                      XPCOM_GLUE_USE_NSPR
           配置属性->链接器->输入->附加依赖项:nspr4.lib
                                                              xpcom.lib
                                                              xpcomglue_s_nomozalloc.lib
           点击生成,生成组件成功。
  • 相关阅读:
    CSS之旅——第二站 如何更深入的理解各种选择器
    CSS之旅——第一站 为什么要用CSS
    记录一些在用wcf的过程中走过的泥巴路 【第一篇】
    asp.net mvc 之旅—— 第二站 窥探Controller下的各种Result
    asp.net mvc 之旅—— 第一站 从简单的razor入手
    Sql Server之旅——终点站 nolock引发的三级事件的一些思考
    Sql Server之旅——第十四站 深入的探讨锁机制
    Sql Server之旅——第十三站 对锁的初步认识
    Sql Server之旅——第十二站 sqltext的参数化处理
    Sql Server之旅——第十一站 简单说说sqlserver的执行计划
  • 原文地址:https://www.cnblogs.com/ourroad/p/2344403.html
Copyright © 2011-2022 走看看