2016-07-26 2 views
1

Я хочу сделать основной пример дополнения Firefox с помощью js-ctype. Во-первых, я сделал файл .dll с помощью простого кода C:Компонент возвратил код ошибки: 0x80004002 (NS_NOINTERFACE) [nsIFileURL.file]

#include "stdio.h" 
extern "C" 
{ 
    __declspec(dllexport) int add(int a, int b) { return a + b; } 
} 

Файл библиотеки прекрасно. Я тестировал его в другом проекте. я загрузить его JS-ctypes код:

var {Cu , Cc, Ci} = require("chrome"); 
Cu.import("resource://gre/modules/ctypes.jsm", null); 
Cu.import("resource://gre/modules/Services.jsm"); 
var self = require("sdk/self"); 
var prompts = Cc["@mozilla.org/embedcomp/prompt-service;1"].getService(Ci.nsIPromptService); 
var dataUrl = self.data.url("Js-CtypeLib.dll"); 
dataUrl = Services.io.newURI(dataUrl,null,null).QueryInterface(Ci.nsIFileURL).file.path; 
var lib, add; 

try{ 
    console.log("Load library"); 
    lib = ctypes.open("Js-CtypeLib.dll"); 
    try{ 
     declareFunc(); 
    } 
    catch(e){ 
     console.log("Error declare function"); 
    } 
} 
catch(e){ 
    console.log("Error load Library!"); 
} 

function declareFunc(){ 
    add = lib.declare("add", ctypes.default_abi, ctypes.int, ctypes.int, ctypes.int); 
} 

function test(){ 
    var rs = add(4,2); 
    prompts.alert(null, "Result: ", rs); 
    lib.close(); 
} 

exports.test = test; 

, а затем, я называю support.js файл по index.js

var buttons = require('sdk/ui/button/action'); 
var tabs = require("sdk/tabs"); 
var support = require("./support.js"); 
var button = buttons.ActionButton({ 
    id: "mozilla-link", 
    label: "Visit Mozilla", 
    icon: { 
     "16": "./images/icon-16.png", 
     "32": "./images/icon-32.png", 
     "64": "./images/icon-64.png" 
    }, 
    onClick: handleClick} 
); 

function handleClick(state) { 
    support.test(); 
} 

Наконец, в ЦМД, я запускаю его и получить:

Component returned failure code: 0x80004002 (NS_NOINTERFACE) [nsIFileURL.file] 

Полный текст ошибки:
this error

+0

Пожалуйста, опишите, что вы ожидаете, чтобы произошло /, что вы пытаетесь достичь. Пожалуйста, предоставьте полный [mcve], который мы можем дублировать проблему. – Makyen

+0

Вам не нужно создавать DLL, вы можете использовать собственные библиотеки платформ. Для этого вы можете скопировать эти примеры - https://developer.mozilla.org/en-US/docs/Mozilla/js-ctypes/Using_js-ctypes/Standard_OS_Libraries – Noitidart

ответ

0

Вам необходимо отметить свой аддон как «распакованный» в package.json. Затем вы должны использовать uri file:// при вызове ctypes.open(file_uri_here).

Чтобы получить файл УИР файла в вашем аддоне вы могли бы сделать это:

Components.utils.import("resource://gre/modules/Services.jsm"); 
var cr = Components.classes['@mozilla.org/chrome/chrome-registry;1'].getService(Components.interfaces.nsIChromeRegistry); 

var chromeURI_myLib = Services.io.newURI('chrome://youraddon/content/mySubFolder/myCFunctionsForUnix.so', 'UTF-8', null); 
var localFile_myLib = cr.convertChromeURL(chromeURI_myLib); 
var jarPath_myLib = localFile_myLib.spec; // "jar:file:///C:/Users/Vayeate/AppData/Roaming/Mozilla/Firefox/Profiles/aecgxse.Unnamed%20Profile%201/extensions/[email protected]!/mySubFolder/myCFunctionsForUnix.so" 
var filePath_myLib = localFilemyLib.path; 

ctypes.open(filePath_myLib); 
Смежные вопросы