[新闻] dxpcom v0.1 发布

qiezi 2007-04-17
看C/C++代码很容易烦燥的,各种宏让你觉得你正在读一篇擦过PP的论文,不想读但它本身又有价值。。
qiezi 2007-04-18
0.2版打算安排到周末,这几天感觉很累,前天晚上一整晚做梦跟人讨论网络架构,昨天一整晚都做梦跟人讨论erlang。!得去弄点安眠药了,白天上班都没精神。
achun 2007-04-18
我想要一溜小跑去追你,
呵呵,估计会摔个大跟头!
qiezi 2007-04-19
下面是最新的可工作版本:
import mozilla.dxpcom.nsXPCOM;
import mozilla.dxpcom.nsILocalFileD;
import mozilla.dxpcom.nsIComponentManagerD;
import mozilla.dxpcom.StringAPI;
import mozilla.dxpcom.QueryInterface;
import std.string;
import std.stdio;

void main(char[][] args)
{
    NS_InitXPCOM2(null, null, null);

    nsIComponentManagerD componentManager = GetComponentManager();

    nsILocalFile ifile = null;
    componentManager.CreateInstanceByContractID(
        "@mozilla.org/file/local;1",
        null,
        &NS_ILOCALFILE_IID,
        cast(void**)&ifile
        );

    nsILocalFileD ifiled = new nsILocalFileD(ifile);

    ifiled.InitWithPath("~/dprojects/dxpcom/test.d"w);

    long filesize = ifiled.FileSize;
    writefln("GetFileSize result: %d", filesize);

    NS_ShutdownXPCOM(null);
}


目前转换程序问题还不少,并不所有东西都能自动转过来,我改得有点头痛了。主要的几个问题有:

* 返回值是nsACString 临时变量定义错误new ACString(retval)应为new ACString(),参数传递错误&_retval应为cast(nsACString*)_retval
* 返回值是FILE* 少定义和返回
* 返回值是PRLibrary* 少定义和返回
* 返回值是PRFileDesc* 少定义和返回
* nsCID/nsIID 参数无法处理
* void** 参数无法处理

最终的工作版本应该是这样的:

import mozilla.dxpcom.nsXPCOM;
import mozilla.dxpcom.nsILocalFileD;
import mozilla.dxpcom.nsIComponentManagerD;
import mozilla.dxpcom.StringAPI;
import mozilla.dxpcom.QueryInterface;
import std.string;
import std.stdio;

void main(char[][] args)
{
    NS_InitXPCOM2(null, null, null);

    nsIComponentManagerD componentManager = GetComponentManager();

    // ContactID和IID应该还可以省去一个
    nsILocalFileD ifiled = cast(nsILocalFileD)
      componentManager.CreateInstanceByContractID(
        "@mozilla.org/file/local;1",
        null,
        &NS_ILOCALFILE_IID
        );

    ifiled.InitWithPath("~/dprojects/dxpcom/test.d"w);

    long filesize = ifiled.FileSize;
    writefln("GetFileSize result: %d", filesize);

    NS_ShutdownXPCOM(null);
}
qiezi 2007-04-19
不想再去修改这工具了,打算用生成+修正的方式。
h_rain 2007-04-19
xpidl我也看了一下,真的是...

你能坚持改出来现在的东西也真是不容易了。

// ContactID和IID应该还可以省去一个   
    nsILocalFileD ifiled = cast(nsILocalFileD)   
      componentManager.CreateInstanceByContractID(   
        "@mozilla.org/file/local;1",   
        null,   
        &NS_ILOCALFILE_IID   
        );

关于这个,我觉得还是应该按照原计划先进行标准的C++风格的接口转换,再进行异常风格接口的包装。
其他需要的进一步提供方便的工具,可以手动编写模板,工作量应该不会太多。
qiezi 2007-04-19
C++风格本来就保留了。现在说的就是异常风格的。

上面这个异常风格还可以简化为:
T CreateInstanceByContraceID(T)(char[] aContactID, nsISupportsD aDelegate = null)

使用是这样的:
auto ifiled = componentManager.CreateInstanceByContractID!(nsILocalFileD)(
    "@mozilla.org/file/local;1",     
    null);

ContactID和类型之间可能还是不能省掉,所以这里还是保留了。

类似的,QueryInterface包装成这样:
T QueryInterface(T)();

这个T是我们的包装类,可能还是要作一下限定。因为可以根据T找到它所对应的IID,所以IID参数就可以省去了,使用方法:
nsIComponentManagerD cm = ...;
auto iobj = cm.QueryInterface!(nsISupportsD)();

使用应该还是比较方便的。
h_rain 2007-04-19
nsILocalFileD与"@mozilla.org/file/local;1"可以进行映射
利用编译期静态判断和别名,代码会好看得多。
qiezi 2007-04-19
主要是觉得IID和ContactID同时存在应该是有理由的,可能会在某些情况下有不同含义。

不过也比较好办,做成默认参数就行了。

auto ifiled = componentManager.CreateInstanceByContractID!(nsILocalFileD)();  

auto ifiled = componentManager.CreateInstanceByContractID!(nsILocalFileD)(null);  

auto ifiled = componentManager.CreateInstanceByContractID!(nsILocalFileD)(  
    null, "@mozilla.org/file/local;1");  

形式定义是这样的:
nsISupportsD CreateInstanceByContractID(nsISupportsD aDelegate = null, char[] aContractID = null){
qiezi 2007-04-20
修改xpidl可是严重损害视力亚,趴在这几小时不动,没有好的IDE是比较麻烦。这个先放下了,以后就算还要改,我也想另外再做了,不知道有没有ruby做的idl解析器。
Global site tag (gtag.js) - Google Analytics