houkai6的专栏

其实我是一个程序猿

vs编译和测试xpcom组件

     XPCOM ( Cross Platform Component Object Model),是一个跨平台的软件框架,它使开发人员把一个大的软件工程分解成各个小的独立的模块,然后再运行时再组装在一起,这就是组件化的思想。原理类似于MSCOM,需要理解其原理可以参考《com本质论》。进一步了解xpcom请进https://developer.mozilla.org/en-US/docs/XPCOM



 第一步:搭建环境

     下载gecko-sdk-win32-msvc-1.8.0.4.zip,然后解压到相应目录,解压后如下所示

    

第二步:创建接口文件

         1.使用VC下的guidgen 生成GUID,如“7013591D-0E10-407E-B85D-E72286E0349D"

       

    2.创建接口文件定义

    #include "nsISupports.idl"
    [scriptable, uuid(7013591D-0E10-407E-B85D-E72286E0349D)]
    interface ICalculate : nsISupports
   {
       long Add(in long a, in long b);
       long Sub(in long a, in long b);
   };


   3. 生成头文件和类型库文件

   在命令行列调用gecko-sdk\bin目录里xpidl工具处理ICalculate.idl文件

    xpidl   -m header -I  "idl目录的路径"   ICalculate.idl

    xpidl   -m typelib -I  "idl目录的路径"   ICalculate.idl

  (如果提示缺少dll文件,请在这里下载http://ftp.mozilla.org/pub/mozilla.org/mozilla/source/wintools.zip 

   解压缩后把…\wintools\buildtools\windows\bin\x86目录里的 glib-1.2.dll    libIDL-0.6.dll 放到gecko-sdk\bin目录里


第三步:创建新文件

    根据ICalculate .h创建文件Calculate .h,Calculate .cpp,CalculateModule.cpp。

/* Calculate .h*/
#ifndef __CALCULATE_H__
#define __CALCULATE_H__

#include "ICalculate.h"

#define CALCULATE_CLASSNAME "A Simple XPCOM Sample"
#define CALCULATE_CONTRACTID "@mydomain.com/XPCOMSample/Calculate;1"
#define CALCULATE_CID  { 0x7013591d, 0xe10, 0x407e, { 0xb8, 0x5d, 0xe7, 0x22, 0x86, 0xe0, 0x34, 0x9d } }

// {7013591D-0E10-407E-B85D-E72286E0349D}
class Calculate : public ICalculate
{
public:
	NS_DECL_ISUPPORTS
	NS_DECL_ICALCULATE
};
#endif

/* Calculate.cpp*/
#include "Calculate.h"
NS_IMPL_ISUPPORTS1(Calculate, ICalculate)

NS_IMETHODIMP Calculate::Add(PRInt32 a, PRInt32 b, PRInt32 *_retval) 
{
        *_retval = a + b;
        return NS_OK; 
} 


NS_IMETHODIMP Calculate::Sub(PRInt32 a, PRInt32 b, PRInt32 *_retval) 
{
        *_retval = a - b;
        return NS_OK; 
} 
/* CalculateModule.cpp*/
#include "nsIGenericFactory.h"
#include "Calculate.h"


NS_GENERIC_FACTORY_CONSTRUCTOR(Calculate)

static nsModuleComponentInfo components[] =
{
	{
		CALCULATE_CLASSNAME,
		CALCULATE_CID,
		CALCULATE_CONTRACTID,
		CalculateConstructor,
	}
};


NS_IMPL_NSGETMODULE("CalculateModule", components)

第四步:创建、编译工程


    1.使用VC,创建新的DLL工程,将ICalculate.h,Calculate.h,Calculate.cpp,CalculateModule.cpp添加到工程中。


    2.配置

       2.1 项目->属性  如图:

       

      2.2  c/c++ -> 常规 -> 附加包含目录 (把gecko-sdk\include目录添加进去)

      2.3  链接器 -> 常规 -> 附加库目录    (把gecko-sdk\lib目录添加进去)

      2.4  链接器 -> 输入-> 附加依赖项     (把nspr4.lib    xpcom.lib   xpcomglue_s.lib添加进去)

  然后编译


第五步:注册xpcom

      在gecko-sdk\bin目录下创建components目录,并把上一步生成的dll文件和第二步生成的xpt文件放到components目录,然后运行regxpcom.exe。

      成功后,components目录里的compreg.dat和xpti.dat里面会有相应的注册信息,如果components目录里没有compreg.dat和xpti.dat,则注册成功后会生成这两个文件。注册内容如下:

    

   (如果提示缺少dll文件,请在这里下载http://ftp.mozilla.org/pub/mozilla.org/mozilla/releases/mozilla1.8b1/mozilla-win32-1.8b1.zip

     把mozilla目录下的 xpcom.dll   xpcom_core.dll   nspr4.dll   plc4.dll   plds4.dll  放到gecko-sdk\bin目录里


第七步:编写测试文件

      在上面的解决方案中添加新的项目,并写入测试代码,如下

#include <stdio.h>
#include <nsXPCOM.h>
#include <nsComponentManagerUtils.h>

#include "..\\Calculate\\ICalculate.h"
#include "..\\Calculate\\Calculate.h"

int main(int agrc, char *argv[])
{
	nsresult rv;
	nsCOMPtr<nsIServiceManager> servMan;

	// Initialize XPCOM and check for failure ...
	rv = NS_InitXPCOM2(getter_AddRefs(servMan), nsnull, nsnull); 
	if ( NS_FAILED(rv) )
	{
		printf("Calling NS_InitXPCOM returns [%x].\n", rv);
		return -1;
	}


	// Get the Component object;
	nsCOMPtr<ICalculate> iSample;
	iSample = do_CreateInstance(CALCULATE_CONTRACTID, &rv);
	if ( NS_FAILED(rv) )
	{
		printf("Calling GetServiceByContractID returns [%x].\n", rv);
		NS_ShutdownXPCOM(nsnull);

		return -1;
	}

	int ret;
	iSample->Add(4, 3, &ret);
	printf("4 + 6 = %d\n", ret);

	iSample->Sub(4, 3, &ret);
	printf("4 - 6 = %d\n", ret);

	NS_ShutdownXPCOM(nsnull);
	return 0;
}

第七步:配置、编译测试项目

    7.1  打开 项目->属性

    7.2  c/c++ -> 常规 -> 附加包含目录 (把gecko-sdk\include目录添加进去)

    7.3  链接器 -> 常规 -> 附加库目录    (把gecko-sdk\lib目录添加进去)

    7.4  链接器 -> 输入-> 附加依赖项     (把nspr4.lib    xpcom.lib   xpcomglue_s.lib添加进去)

  然后编译


第八步:运行测试程序

     把上一步生成的exe文件放到gecko-sdk\bin目录,然后运行。 测试结果如下:

 

   




阅读更多
个人分类: com
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭