[新闻] 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解析器。
|