2011-11-19 19 views
3

我已經對Mozilla(6.0.2)代碼中的nsMediaStream.h/cpp進行了一些修改,其中一個要求我從中獲取ASCII字符串Mozilla框架用於表示和解析URI的nsIURI類。人們可能會認爲,似乎很容易。 Mozilla文檔(https://developer.mozilla.org/en/nsIURI)告訴我可以使用屬性asciiSpec來獲取這樣的字符串。 nsACString的文檔非常混亂,但這是另一回事。nsIURI沒有會員'asciiSpec','asciiHost'等錯誤

當事情南下是,當我嘗試使用使用nsMediaStream的nsIURI可變穆裏

mURI->asciiSpec 

我從MSVC編譯器以下錯誤:

[..]/content/media/nsMediaStream.cpp(146) : 
error C2039: 'asciiSpec' : is not a member of 'nsIURI' 
     [..]\obj-i686-pc-mingw32\dist\include\nsIURI.h(83) : see declaration of 'nsIURI' 

當我看引用的nsIURI.h文件,它是從接口IDL文件生成的,我看到以下內容:http://google-web-toolkit.googlecode.com/svn/plugin-sdks/gecko-sdks/gecko-1.9.0/include/nsIURI.h

據我可以告訴說heade r文件與Mozilla代碼中使用的nsIURI完全沒有任何關係,似乎更多的是接口/原型而不是實際的類。文檔中列出的屬性和方法都不存在。 MSVC似乎同意我這一點。

我覺得我在這裏錯過了一些很大的東西,但是即使在Mozilla源文件中花費了幾個月的時間並保留了構建系統,我似乎無法弄清楚這一點,至今我也沒有其他人提出過這個問題。任何線索將不勝感激:)

回答

3

當從C++使用XPCOM沒有屬性 - 所有接口屬性都轉換爲getter/setter方法。接口定義文件(IDL文件)使用xpidl工具編譯爲常規C++頭文件 - 因此您找到的文件是正確的文件,但它是自動生成的。你會得到asciiSpec屬性是這樣的:

nsCString spec; 
nsresult rv = mURI->GetAsciiSpec(spec); 
if (NS_FAILED(rv)) 
    ... // handle error 
else 
    ... // do something with spec variable 

沒有SetAsciiSpec方法,因爲這個屬性是隻讀的。

+1

真棒,我希望Mozilla的文檔是這個清楚:)也許這個答案會爲Mozilla維基添加一個很好的?無論如何,非常感謝您的幫助,Wladimir :) – MayaPosch

+1

@MayaPosch:本文似乎給出了一個很好的概述:https://developer.mozilla.org/en/Creating_XPCOM_Components/An_Overview_of_XPCOM。但是 - 是的,它並沒有解釋從IDL文件到C++頭文件的轉換過程是如何工作的(特別是方法名稱大寫和替換屬性)。 –

+1

謝謝你的鏈接。回顧一下我之前嘗試使用它的方法,我實際上已經接近您發佈的示例,只是我不知道要使用哪種字符串類型。 nsACString顯然不能使用。 (返回)類型的IDL在最好的時候並不十分清楚,說實話:) – MayaPosch