[新闻] 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部分好像已经转换完成了,昨天编译时已经没报这些错误了,你可以先试试。
Global site tag (gtag.js) - Google Analytics