簡體   English   中英

XPCOM對象方法無法從JavaScript訪問

[英]XPCOM object method is unaccessible from JavaScript

我正在嘗試為Firefox構建擴展程序。 此擴展使用XPCOM組件(C ++ dll)。 我正在編譯DLL,編譯正常。

我還成功構建了一個可以從XPCOM實例化該對象的JS代碼:

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();
};

調用start()函數時,出現Javascript錯誤:“不是函數”

greenfox.start();

你有什么主意嗎? 我的XPCOM中似乎沒有任何功能公開。

您似乎正在查看僅公開nsISupports接口的對象。 默認情況下,您的接口( nsISample )將不會公開,您必須顯式請求它。 例如,可以通過實例化組件來做到這一點:

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

或者,您也可以在已經具有的對象上調用QueryInterface

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

通常,出於此處概述的原因,我不建議使用二進制XPCOM組件,維護它們需要花費大量精力。 我寧願建議編譯一個常規DLL並通過js-ctypes使用它。 引用js-ctypes的二進制組件時,提到了如何在附件中定位DLL以便通過js-ctypes使用它。

您是否用uuid調用QueryInterface? 在使用創建的組件實例之前,必須先調用它。 您的用法與這里的內容相符嗎?

如果您不想使用XPCOM,則可以使用js-ctypes

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM