2007年6月11日星期一

创建C++ XPCOM组件


本文翻译自 Creating a C++ XPCOM component,结合自己学习过程添加部分注意事项,希望对初学XPCOM的朋友有所帮助,并多多交流。

关于

这是一个step-by-step的入门教程,讲述在LinuxWindows下创建,构建和注册一个XPCOM 组件的过程。

下载

本文涉及的源代码可以从这里下载。

创建组件

1. 下载 gecko-sdk-i586-pc-msvc-1.7.zip,解压到本地。、


2.
为主接口创建GUID:

a. Windows下用guidgen (Visual Studio 2003/2005 工具->创建GUID)

b. Linux 下用uuidgen

3. 创建接口定义 - IMyComponent.idl

a. 使用以下模板,添加方法和属性给接口。
b.
填入刚生成的GUID

#include "nsISupports.idl"
[scriptable, uuid(
你刚生成的GUID)]
interface IMyComponent : nsISupports
{
long Add(in long a, in long b);
};

4. 用接口定义文件生成接口头文件和类型库(typelib)文件

a. 使用Gecko SDK中的xpidl 工具. xpidlGecko SDK主目录的bin/

b. 将下列命令中的_DIR_替换为Gecko SDK主目录下的idl目录路径

c. xpidl -m header -I_DIR_ IMyComponent.idl 将会创建 IMyComponent.h

d. xpidl -m typelib -I_DIR_ IMyComponent.idl 将会创建 IMyComponent.xpt

e. 注意运行xpidl需要glib-1.2.dlllibIDL-0.6.dll,这些库包含在wintools.zip 中,解压后在gecko_wintools\buildtools\windows\bin\x86下。

f. 生成的IMyComponent.h,IMyComponent.xpt在当前目录下。

5. 接口头文件IMyComponent.h中包含了模板,用于构建你自己组件头和实现文件。你可以拷贝粘帖这些模板,只要修改组件名就可以了。

6. 创建你的组件的头文件 -MyComponent.h

a. 首先加入

#ifndef _MY_COMPONENT_H_
#define _MY_COMPONENT_H_
...
#endif

b. 加入 #include "IMyComponent.h" 以包含接口的定义。
c.
为组件创建一个GUID. 注意是这种格式:{ 0x9d8eb88b, 0x30ce, 0x46e0, { 0x81, 0xb2, 0xca, 0xb1, 0x5a, 0xc6, 0xba, 0xc7 } }

d. 加入下列代码,它们主要用于定义你的组件名,contract IDGUID

#define MY_COMPONENT_CONTRACTID "@mydomain.com/XPCOMSample/MyComponent;1"
#define MY_COMPONENT_CLASSNAME "A Simple XPCOM Sample"
#define MY_COMPONENT_CID
你组件的GUID

e. IMyComponet.h上拷贝头文件的模板(以/* Header file */开始,到 /* Implementation file */结束)
f.
用你的组件名替换所有的_MYCLASS_

7. 创建你的组件的实现文件 - MyComponent.cpp

a. 加入#include "MyComponent.h"以包含你自己的组件定义
b.
IMyComponent.h中拷贝实现模板(以 /* Implementation file */开头到#endif
c.
用你的组件名替换所有的_MY_CLASS_
d.
加入实现代码。

8. 创建你的模块定义文件 -MyComponentModule.cpp

a. 添加#include "nsIGenericFactory.h" 用以包含Mozilla GenericFactory的定义
b.
添加#include "MyComponent.h" 以包含你的组件定义
c.
添加 NS_GENERIC_FACTORY_CONSTRUCTOR(MyComponent),以定义你组件的构造函数。注意:MyComponent是你的组件名。
d.
添加

static nsModuleComponentInfo components[] =

{

{

MY_COMPONENT_CLASSNAME,
MY_COMPONENT_CID,
MY_COMPONENT_CONTRACTID,
MyComponentConstructor, //
注意将MyComponent替换为你的组件名。

}

};

以定义类名,contract ID和你组件的GUID.
e.
添加 NS_IMPL_NSGETMODULE("MyComponentsModule", components)以输出上述所有信息到Mozilla.

9. 创建makefiles或者工程

a. 你可以根据例子 里提供的模板去定制你的makefile.

b. 或者,你可以创建一个Visual C++工程,进行一些简单的设置就可以了。

从例子程序构建

1. 这里 下载示例代码,解压到本地。

2. 编辑makefile

a. makefile位于示例代码的src目录下。

b. Makefile用于Linux, MyComponent.mak用于Windows.

c. 编辑makefile, 改变 GECKO_SDK_PATH 变量指向你的Gecko SDK 目录。

3. 构建示例程序

a. 打开命令行或shell(Windowscmd, Linuxtcsh, bash)

b. 切换到示例代码的目录。

c. Linux下键入make, MyComponent.so将被创建。

d. Windows下键入 nmake /f MyComponent.mak. Debug\MyComponent.dll将创建, 注意,如果提示缺少nspr4.lib, plc4.lib, plds4.lib, 下载gecko-sdk-i586-pc-msvc-1.8b1.zip解压后在lib文件夹下。Mozilla的文件太乱了,1.71.8SDK文件都不全,所以只能1.71.8都下载~

e. 或者用 nmake /f "MyComponent.mak" CFG="MyComponent - Win32 Release" 创建release版的,Release\MyComponent.dll 将被创建

4. 注册新组件到Mozilla

a. 拷贝 MyComponent.so/MyComponent.dllIMyComponent.xpt Mozillacomponents目录。在Windows下这个目录一般在 C:\Program Files\Mozilla Firefox\components. Linux~/firefox/components (或~/mozilla/components

b. 运行Gecko SDK 提供的regxpcom注册新组件,你可以用 regxpcom -x components路径 来注册,或者在Mozilla安装路径下创建.autoreg,让它自动注册。

c. 删除Mozilla配置目录下的 xpti.dat compreg.dat. Windows配置目录在C:\Documents and Settings\USERNAME\Application Data\Mozilla\Firefox\Profiles\default.??? Linux下的在~/.mozilla/firefox/default.??? 下。

5. 测试新组件

a. 重启Mozilla Firefox

b. 打开 示例代码里的MyComponentsTest.html, "GO"按钮

c. 如果一切正常,你可以看到 “3+4=7”.

链接和资源:

1. IBM developerWorks - XPCOM Overview[第1部分][第2部分][第3部分][第4部分][第5部分]

2. Doug Turner创建XPCOM组件

3. 为Mozilla创建应用程序 【第八章-XPCOM



2007年6月7日星期四

flickr 被封了

表现为照片不能浏览,据说可能与厦门PX事件和8*8事件有关,详见月光博客,很多人以为互联网特别是web2.0可以给大家言论的自由,但事实证明,自由在中国是一件宝贵的东西,因为它的不易得到而显得尤其宝贵,而宝贵的东西总是有人去追求。中国的互联网正在被改造成一张用于监管人民言论的网,但我想真理和正义是任何时候都可以拿出来讨论的,防民之口甚于防川,为什么总有一些人不遗余力地做着这些伤害人民的事呢?相信历史会把这些人扫进垃圾堆的。

2007年5月7日星期一

潘多拉因版权问题在中国停止服务。

潘多拉是我最喜欢的音乐服务,但五一长假回来,我已经无法再使用它的服务了。虽然上段时间潘多拉发出求救信时已经感到情况不妙,但还是没想到事情来得这么快。有人说,人所有的智慧都集中在两件事上:希望和等待,这也是我们这些普通网民现在所能做的。
唯一让我好奇的是,潘多拉这次到底在哪些国家停止服务了?请知道的朋友告诉我吧~

这是中国用户登录潘多拉时看到的声明:

Dear Pandora Visitor,

We are deeply, deeply sorry to say that due to licensing constraints, we can no longer allow access to Pandora for most listeners located outside of the U.S. We will continue to work diligently to realize the vision of a truly global Pandora, but for the time being we are required to restrict its use. We are very sad to have to do this, but there is no other alternative.

We believe that you are in China (your IP address appears to be 219.143.146.104). If you believe we have made a mistake, we apologize and ask that you please contact us at pandora-support@pandora.com

If you are a paid subscriber, please contact us at pandora-support@pandora.com and we will issue a pro-rated refund to the credit card you used to sign up. If you have been using Pandora, we will keep a record of your existing stations and bookmarked artists and songs, so that when we are able to launch in your country, they will be waiting for you.

We will be notifying listeners as licensing agreements are established in individual countries. If you would like to be notified by email when Pandora is available in your country, please enter your email address below. The pace of global licensing is hard to predict, but we have the ultimate goal of being able to offer our service everywhere.

We share your disappointment and greatly appreciate your understanding.

Sincerely,

Tim Westergren
Founder

2007年4月8日星期日

千橡困境

前段时间看到麦田提到人人网歇菜的消息,后来看到千橡正式关闭人人网.

今天又在ChinaWeb2.0Review上看到关于千橡的这篇文章,
文中引用了张亮博客上的长话短说两则, 指出千橡贿赂三大门户,隐去环球企业家杂志上关于千橡的一篇名为千橡幻象的负面报道.

千橡幻想这篇文章深度揭示了千橡巨额融资背后隐藏的危机, 文章认为,由于将过多的经历放在资本市场, 急功近利(急于上市)而不能专注于产品质量的提升导致了千橡今天的困境. 而陈一舟个人的心态变化也是导致千橡今日局面的一个微妙因素.

这些文字显然沉重打击了千橡的上市梦,所以我们才看到标称中国web2.0旗舰的千橡贿赂传统门户隐去自身负面报道的奇怪一幕.

Google拼音输入法, 一石激起千层浪

Google这些年一直以其厚重的产品和技术创新树立其良好的品牌. Google拼音输入法一出, 新浪的调查显示80%的人愿意试用, 可见大家对Google品牌的厚爱.

但马上传出Google原来盗用了Sogo的词库,并证据凿凿, Sogo发表声明对此怯生生地表示强烈愤慨,Google也出来回应, 称试验阶段确含有非自有数据 并称已将其输入法更新到使用自有词库的1.0.17版本. 虽然诚意不足, 但到底是承认了错误. 此事也许会告一段落吧?

不管怎样, 双方都借全国人民的眼球好好地将此事炒作了一把. 谷歌牺牲了Google的品牌,换来了自己的流量. Sogo让大家知道了自己工作的价值, 以前不敢做推广的东西这次终于风光了一把.

Sogo和Google的输入法之争就这样一片热闹纷乱中开始了.

Update:谷歌再发声明:明确向搜狐公司道歉

相关链接:
搜狗拼音输入法词库是怎样炼成的
新浪关于输入法抄袭事件的专题
How Google Can Build Chinese Input Method Better

2007年4月1日星期日

没事去网吧转转

那天去亿代天兵打台球,台球室与网吧隔壁,排号的时候我顺便去网吧考察了一下。

这个网吧在地下一层,共有300个左右的座位,电脑用的是19液晶,上网平均3元/小时,基本上座无虚席。我在里面转了两圈,令我震惊的是,网吧里打开网页的只有2个人,一个上新浪看股票,另一个开的是百度,其他人都在玩网络游戏或看电影,90%的人在玩网络游戏,剩下的在看电影,上网的大多数是年轻人,看电影的基本上是女生。

诺大一个网吧,打开网页的只有2个人,可见中国的web2.0缺少群众基础,光是圈子里面热闹而已。娱乐方式还是游戏和电影来的直接痛快。web2.0,谁在用?

大家都离校了

快毕业了,大家为了早点入职,纷纷办理了离校手续,到外面租房了。今天为室友陈洋搬家,他住到了外经贸大学对面。现在宿舍就剩我一个人了,为了节省房租,我决定住到7月初。届时将宣告我学生生涯的结束。我从初中开始宿舍群居生活,到现在已有13年,很怀念这13年的群居生活啊。除了本科比较孤僻以外,其他的每一个阶段都有玩的很要好的同学,这些友谊使我终生难忘。