[新闻] dxpcom v0.1 发布
qiezi
2007-04-24
昨天准备把最新的修改svn更新上去,结果操作失败,今天早晨20分钟没完只好取消了,要上班呢。一会再试试。
|
|
qiezi
2007-04-24
才处理了45%,大概600个文件吧。
主要问题是idl没有使用C++头文件一样的#ifndef守卫,所以它自己也为了防止重复include而伤脑筋,使用了include和前向声明两种方式,include是没问题的,直接转成import,而前向声明则比较麻烦,特别是有些idl文件里面包含多个接口。 |
|
qiezi
2007-04-24
遇到个麻烦事,谁能解释一下:
src/mozilla/xpcom/nsIDOMXULSelectCntrlEl.d: module mozilla.xpcom.nsIDOMXULSelectCntrlEl module and package have the same name 看不懂了,还真郁闷。文件内容如下: /* * DO NOT EDIT. THIS FILE IS GENERATED FROM nsIDOMXULSelectCntrlEl.idl */ module mozilla.xpcom.nsIDOMXULSelectCntrlEl; public import mozilla.xpcom.nsrootidl; public import mozilla.xpcom.nsIDOMXULControlElement; public import mozilla.xpcom.nsIDOMXULSelectControlItemElement; /* forward declaration */ /* starting interface: nsIDOMXULSelectControlElement */ const char[] NS_IDOMXULSELECTCONTROLELEMENT_IID_STR = "59fec127-2a0e-445b-84b5-a66dc90245db"; const nsIID NS_IDOMXULSELECTCONTROLELEMENT_IID= {0x59fec127, 0x2a0e, 0x445b, [ 0x84, 0xb5, 0xa6, 0x6d, 0xc9, 0x02, 0x45, 0xdb ]}; extern(Windows) interface nsIDOMXULSelectControlElement : nsIDOMXULControlElement { static const char[] IID_STR = NS_IDOMXULSELECTCONTROLELEMENT_IID_STR; static const nsIID IID = NS_IDOMXULSELECTCONTROLELEMENT_IID; /* attribute nsIDOMXULSelectControlItemElement selectedItem; */ nsresult GetSelectedItem(nsIDOMXULSelectControlItemElement *aSelectedItem); nsresult SetSelectedItem(nsIDOMXULSelectControlItemElement aSelectedItem); /* attribute long selectedIndex; */ nsresult GetSelectedIndex(PRInt32 *aSelectedIndex); nsresult SetSelectedIndex(PRInt32 aSelectedIndex); /* attribute DOMString value; */ nsresult GetValue(nsAString * aValue); nsresult SetValue(nsAString * aValue); /* nsIDOMXULSelectControlItemElement appendItem (in DOMString label, in DOMString value); */ nsresult AppendItem(nsAString * label, nsAString * value, nsIDOMXULSelectControlItemElement *_retval); /* nsIDOMXULSelectControlItemElement insertItemAt (in long index, in DOMString label, in DOMString value); */ nsresult InsertItemAt(PRInt32 index, nsAString * label, nsAString * value, nsIDOMXULSelectControlItemElement *_retval); /* nsIDOMXULSelectControlItemElement removeItemAt (in long index); */ nsresult RemoveItemAt(PRInt32 index, nsIDOMXULSelectControlItemElement *_retval); } 被它拦了一阵子了。。 |
|
qiezi
2007-04-24
原来是另一个文件里写成了import mozilla.xpcom.nsIDOMXULSelectCntrlEl.idl
所以它说package和module同名。。。 |
|
qiezi
2007-04-25
现在是尽量不修改idl文件,而是给xpidl打补丁。每次打完补丁就要编译,然后重新把1341个idl文件转成d文件再编译,这个过程比较慢。特别是如果有导入文件错误,每次只能提示一个就中止编译,然后再进行打补丁的工作,有时候修正一个文件的导入错误就要打补丁重新编译几次,时间都花在这上面了。
|
|
qiezi
2007-04-25
上面说的比较散,我集中描述一下目前遇到的困难。
java和C++对于idl前向引用都没有问题,java由于在同一个package里面不需要import,所以处理idl时可以忽略前向引用。C++直接把前向引用生成C++的class就可以了。D就有问题,例子代码如下: // foo.d module foo; interface IFoo{ } // bar.d module bar; interface IFoo; // 前向引用 interface IBar{ void test(IFoo foo); } 由于bar.d里面的“前向引用”实际上声明的是bar.IFoo,而foo.d里面定义的是foo.IFoo,所以链接时会提示找不到bar.IFoo。因为idl里面前向引用声明的接口并不一定在和它同名的idl文件里,所以不能直接把前向引用转成import,实际上我目前是直接转的,但需要对xpidl不断地打补丁。也可以修改xpidl,增加#include,问题是idl本身没有重复包含守卫,使用xpidl时会提示parse fail,这也是它使用前向引用的原因,搞清楚这个错误的原因也花了我很长时间,xpidl非常不友好,目前也有这种错误还没找到原因的。简单的解决办法就是在idl文件中增加%{D ... %}语言专有代码,写上import,当然并不是好办法,目前也只能如此。 从这几点来看,module反而不如java的package好用了。目前的idl对于C++和java都算是比较友好,对D来说就有些郁闷了。 |
|
h_rain
2007-04-25
弄的蛮复杂啊~
我现在想用D来操作火狐浏览器分析页面中的DOM,IE可以遍历得到IE运行的实例,不知道火狐怎么弄.能得到运行的COM实例吗? 要不就从头开始直接使用xpcom组件加载html然后分析DOM. qiezi了解这该怎么弄吗? |
|
qiezi
2007-04-25
我不知道XPCOM是否有多进程支持,多个进程共享同一个XPCOM环境,没看到过这方面的介绍。简单的办法是给FF写插件,用脚本就可以了,用D的话,还是调用XPCOM直接分析DOM吧。
|
|
h_rain
2007-04-25
嗯,看来只能这样了.
|
|
qiezi
2007-04-25
目前trunk里面的DOM部分好像已经转换完成了,昨天编译时已经没报这些错误了,你可以先试试。
|