2011-10-16 48 views
0

我正在致力於Firefox的C++組件,並且我試圖圍繞XPCOM及其所有部件進行思考。這真是令人困惑,所以我試圖通過它,但我試圖穿過一個頁面,並獲得它的所有鏈接。我試圖弄清楚所有對象都做了什麼。所以,如果我有這樣的接口:步行通過一個nsIDOMNodeList

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

您使用xpidl編譯您的接口定義以獲取C++頭文件 - 您可以檢查該文件以查看接口定義是如何轉換的。你的方法定義其實應該看起來像thit:

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; 
} 
+0

我將如何引用NodeList中的每個元素?我只是做 nodeList - > Item(i) – Aeonstrife

+0

@Aeonstrife:'rv = nodeList-> Item(i,getter_AddRefs(node))' - 當從C++調用時,返回值總是轉換爲附加參數。而XPCOM方法的「實際」返回值始終是'nsresult'。 –