[新闻] dxpcom v0.1 发布
h_rain
2007-04-26
哦.
我这现在测试了一下,好像有问题. import mozilla.xpcom.nsXPCOM; import mozilla.xpcom.nsIDOMParser; import mozilla.xpcom.nsIComponentManager; import mozilla.xpcom.nsIDOMDocument; import mozilla.xpcom.nsIDOMHTMLDocument; import mozilla.xpcom.nsISupports; import mozilla.dxpcom.StringAPI; import mozilla.dxpcom.QueryInterface; import std.string; import std.stdio; void main(char[][] args) { nsIComponentManager componentManager; nsresult result; result = NS_InitXPCOM2(null, null, null); result = NS_GetComponentManager(&componentManager); nsIDOMParser DOM = null; result = componentManager.CreateInstanceByContractID( "@mozilla.org/xmlextras/domparser;1", null, &nsIDOMParser.IID, cast(void**)&DOM ); writefln("Create nsIFile instance, result: 0x%08x", result); //AString str = new AString(r"G:\rain\tmp\t.html"w); //PRUnichar Str[]=r"G:\rain\tmp\t.html"w; PRUnichar Str[]=r"<html><head><title>Interface Reference - nsIDOMHTMLDocument</title></head><body><al>test</al></body></html>"w; //result=WebNav.LoadURI(cast(PRUnichar*)&Str,null,nsIWebNavigation.LOAD_FLAGS_NONE,0); nsIDOMDocument doc; AString tStr=new AString(); result=DOM.ParseFromString(cast(PRUnichar*)Str,"application/xhtml+xml",&doc); nsIDOMNodeList NodeList; // nsIDOMHTMLDocument HTMLDoc; // result=doc.QueryInterface(&nsIDOMHTMLDocument.IID,cast(void**)&HTMLDoc); // result=HTMLDoc.GetTitle(cast(nsAString*)tStr); AString TagName = new AString("title"w); result=doc.GetElementsByTagName(cast(nsAString*)TagName,&NodeList); nsIDOMNode Node; uint Len=0; result=NodeList.GetLength(&Len); result=NodeList.Item(0,&Node); result=Node.GetNodeName(cast(nsAString*)tStr); wchar wStr[]=tStr.GetString(); Len=wStr.length; // result = ifile.InitWithPath(cast(nsAString*)str); writefln("str: %s", wStr); result = NS_ShutdownXPCOM(null); writefln(result); } 得到的wStr值好像被截短了:( |
|
qiezi
2007-04-26
怎么我在windows上编译的运行有问题呢?已经在xulrunner文件夹下了。你贴代码时写上code="cpp"吧,这样太难看了亚。
|
|
h_rain
2007-04-26
感觉问题在这:
wchar[] GetString() { wchar* buffer = null; PRBool terminated; uint len = NS_StringGetData(cast(nsAString*)&str, &buffer, &terminated); if (len > 0 && terminated) len -= 1; wchar[] result = buffer[0 .. len].dup; return result; } len有问题. |
|
qiezi
2007-04-26
有可能,你改一下测试看看吧,我都忘了这代码是不是我写了的。。。咋看着这么陌生呢。
|
|
h_rain
2007-04-26
这个代码是用test.d改的,现在很乱~
呵呵,这里的code我不会用:( |
|
qiezi
2007-04-26
h_rain 写道 这个代码是用test.d改的,现在很乱~
呵呵,这里的code我不会用:( code="cpp"引号不能省。 怎么我在windows上这么不顺呢,问题多。。 |
|
h_rain
2007-04-26
wchar[] GetString() { wchar* buffer = null; PRBool terminated; uint len = NS_StringGetData(cast(nsAString*)&str, &buffer, &terminated); if (len > 0 && terminated) len -= 1; wchar[] result = buffer[0 .. len+1].dup; return result; } 这样就好了:) |
|
qiezi
2007-04-26
不应该亚,前面判断有终止符\0时把长度减一,我怀疑会不会影响其它代码。
|
|
h_rain
2007-04-26
我也不知道是怎么回事,反正这么就能得到正确的结果了,不然总是少一个字符.
我这提交太慢了,你来改吧. |
|
qiezi
2007-04-26
噢,搞明白了:
/** * NS_StringGetData * * This function returns a const character pointer to the string's internal * buffer, the length of the string, and a boolean value indicating whether * or not the buffer is null-terminated. * * @param aStr abstract string reference * @param aData out param that will hold the address of aStr's * internal buffer * @param aTerminated if non-null, this out param will be set to indicate * whether or not aStr's internal buffer is null- * terminated * @return length of aStr's internal buffer * * @status FROZEN */ 返回的长度就是字符串的长度,无论terminated是true还是false,所以去掉判断就行了,改成这样: wchar[] GetString() { wchar* buffer = null; PRBool terminated; uint len = NS_StringGetData(cast(nsAString*)&str, &buffer, &terminated); wchar[] result = buffer[0 .. len].dup; return result; } |