2012-01-30 84 views
1

我試圖構建Firefox的擴展。此擴展使用XPCOM組件(C++ dll)。我正在編譯這個DLL,編譯是可以的。從JavaScript無法訪問XPCOM對象方法

我也成功地建立了一個JS代碼instanciates從XPCOM對象:

try { 
    greenfox; 
    return true; 
} catch(e) { 
    alert(e); 
    return false; 
} 

返回的對象是這一個:

QueryInterface 
    QueryInterface() 

__proto__ 
    [xpconnect wrapped native prototype] { QueryInterface=QueryInterface()} 

QueryInterface 
    QueryInterface() 

一切都很好,但我不能打電話這個函數應該在我的XPCOM組件中。

這裏是我的IDL文件:

[scriptable, uuid(ec8030f7-c20a-464f-9b0e-13a3a9e97384)] 
interface nsISample : nsISupports 
{ 
    attribute string value; 
    void writeValue(in string aPrefix); 
    void poke(in string aValue); 

    void start(); 
    double stop(); 
}; 

當callingstart()函數,我得到的JavaScript錯誤: 「是不是一個函數」

greenfox.start(); 

你有什麼想法?似乎沒有功能暴露在我的XPCOM中。

+0

如果你真的在這裏寫了你如何實例化你的XPCOM組件,它會有所幫助。 – 2012-01-31 06:41:56

回答

0

你用你的uuid調用QueryInterface嗎?在使用創建的組件實例之前,有必要調用它。您的用法與here中的內容相符嗎?

如果你不想處理XPCOM,你可以使用js-ctypes

+0

-1在沒有解釋問題的情況下使用swearwords。總之這是「不是答案」的邊界。 – 2012-01-31 06:39:13

+0

對不起,我認爲找到正確的文檔時遇到問題的人會閱讀它,而不是我可能不充分的解釋。 – artificialidiot 2012-01-31 10:47:23

1

您似乎在查看僅暴露nsISupports接口的對象。您的界面(nsISample)默認情況下不會公開,您必須明確請求它。您可以通過實例化你的組件是這樣做的,例如:或者

var greenfox = Components.classes["..."].getService(Components.interfaces.nsISample); 
greenfox.start(); 

,您也可以撥打QueryInterface的對象上,你已經有了:

greenfox.QueryInterface(Components.interfaces.nsISample); 
greenfox.start(); 

一般情況下,我不建議使用二進制XPCOM組件出於原因概述here,維護它們需要付出太多努力。我寧願建議編譯一個正規的DLL並通過js-ctypes使用它。 Reference a binary-component to js-ctypes提到如何找到附加組件中的DLL以通過js-ctypes使用它。

+0

這是一個主角,我還在Mozilla給出的示例中找到了這個代碼。我已經嘗試過,但是當試圖獲取實例時,我收到以下消息:[Exception ...「無法轉換JavaScript參數arg 0 [nsISupports.QueryInterface]」nsresult:「0x80570009(NS_ERROR_XPC_BAD_CONVERT_JS)」location:「JS frame :: chrome://greenfox/content/greenfox_sampler.js :: :: line 11「data:no] – frinux 2012-02-05 17:55:56

+0

我走得更遠:我檢查了Components.interfaces並沒有找到nsISample。 – frinux 2012-02-05 18:08:57

+0

@frinux:這意味着您的界面的XPT文件沒有註冊。要麼你沒有將它包含在你的擴展中,或者[chrome.manifest'中的'interfaces'條目](https://developer.mozilla.org/en/Chrome_Registration#interfaces)不正確。 – 2012-02-05 18:39:12