[新闻] 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;
	}
Global site tag (gtag.js) - Google Analytics