我正在为Firefox开发一个C ++组件,而我正在试图围绕XPCOM及其所有部分。这真的很令人困惑所以我正在努力解决这个问题,但我正试图浏览一个页面并获取所有链接。我试图找出所有对象的作用。所以,如果我有这个界面:
interface nsIPageSummary : nsISupports {
boolean saveSummary(in nsIDOMDocument document,
out unsigned long numLinks,
out unsigned long numImages);
};
在IDL中定义的,我的C ++代码中的方法如下所示:
SaveSummary(nsIDOMDocument* inDoc, PRBool* outSuccess)
{
*outSuccess = PR_FALSE;
nsCOMPtr<nsIDOMNodeList> nodeList;
inDoc->GetElementsByTagName(NS_LITERAL_STRING("A"), getter_AddRefs(nodeList));
}
我知道C ++方法需要更多的参数来匹配界面中定义的参数,但我不明白所有的打字工作方式。就实际列表而言,我是否正确理解
inDoc->GetElementsByTagName(NS_LITERAL_STRING("A"), getter_AddRefs(nodeList));
行将inDoc中的所有“A”标记放入nodeList?而且我只需要遍历nodeList来获取所有内容?
答案 0 :(得分:0)
使用xpidl
编译接口定义以获取C ++头文件 - 您可以检查该文件以查看接口定义的转换方式。你的方法定义应该看起来像是:
nsresult SaveSummary(nsIDOMDocument* inDoc, PRUint32* outNumLinks, PRUint32* outNumImages, PRBool* outSuccess)
我建议在接口定义中使用类型PRUint32
而不是模糊的unsigned long
。我还建议删除返回值:XPCOM方法总是返回nsresult
NS_OK
或错误代码,这足以表示成功或失败。从JavaScript调用时,错误代码会自动转换为异常。最后我建议使用小写标记名称:虽然它在HTML中无关紧要(不区分大小写),但在XHTML文档中只接受小写标记名称。所以你的界面定义应如下所示:
interface nsIPageSummary : nsISupports {
void saveSummary(in nsIDOMDocument document,
out PRUint32 numLinks,
out PRUint32 numImages);
};
相应的实施:
nsresult
SaveSummary(nsIDOMDocument* inDoc, PRUint32* outNumLinks, PRUint32* outNumImages)
{
nsresult rv;
nsCOMPtr<nsIDOMNodeList> nodeList;
rv = inDoc->GetElementsByTagName(NS_LITERAL_STRING("a"), getter_AddRefs(nodeList));
if (NS_FAILED(rv))
return rv;
rv = nodeList->GetLength(outNumLinks);
if (NS_FAILED(rv))
return rv;
rv = inDoc->GetElementsByTagName(NS_LITERAL_STRING("img"), getter_AddRefs(nodeList));
if (NS_FAILED(rv))
return rv;
rv = nodeList->GetLength(outNumImages);
if (NS_FAILED(rv))
return rv;
return NS_OK;
}