2015-02-09 9 views
9

Próbuję zbudować rozszerzenie przeglądarki Firefox, które musi wywoływać natywny kod C.Jak wywołać natywny kod C, używając rozszerzenia js-ctypes Firefox?

Mój kod programu C:

#include<windows.h> 
int add(int a, int b) 
{ 
    return(a + b); 
} 

i mój kod JavaScript jest:

var {Cu} = require('chrome'); 
var self = require('sdk/self'); 
Cu.import("resource://gre/modules/ctypes.jsm"); 
var lib; 
var puts; 
lib = ctypes.open('G:\\Shankar\\Project\\Maidsafe\\Firefox\\addon-sdk-1.17\\jsctype_sample\\data\\Win32Project1.dll'); 

try { 
    puts = lib.declare("add", /* function name */ 
     ctypes.default_abi, /* call ABI */ 
     ctypes.int32_t, /* return type */ 
     ctypes.int32_t, /* argument type */ 
     ctypes.int32_t /* argument type */ 
    ); 
} catch (e) { 
    console.log('Érror'+ e); 
} 

function binaryFile() {   
    var ret = puts(1, 2); 
    dump(ret); 
    lib.close(); 
}; 

exports.binaryFile = binaryFile; 

podczas wywoływania funkcji binaryFile, pojawia się błąd

Couldn't find function symbol in library 

Proszę mi pomóc na zewnątrz. tHanks z góry.

+0

Nie powinieneś używać 'int' zamiast' int32_t'? – meskobalazs

Odpowiedz

5

Jeśli twój dodatek jest dodatkiem, którego nie można ponownie uruchomić, upewnij się, że ustawiono <em:unpack>true</em:unpack>. Dodatek MUSI zostać rozpakowany.

Wspaniale, dostajesz głęboki dodatek! Zobacz to repo: https://github.com/Noitidart/fx-sapi-test To pokazuje kod do main.cpp, który jest kompilowany do biblioteki DLL, a następnie importowany i używany.

Musisz ujawnić swoją funkcję add.

Nawiasem mówiąc, jeśli robiłeś dodatek bootstrap: Spróbuj również wykonać ctypes.open wewnątrz funkcji startup(). Ale nie robisz, robisz Addon SDK addon, więc powinieneś być w porządku. Ale dla twojego importu wykonaj to:

lib = ctypes.open(self.data.url('Win32Project1.dll')); 

W ten sposób nie musisz znać absolutnej ścieżki. Zwłaszcza, że ​​seperator plików \\ jest przeznaczony tylko dla systemu Windows. Systemy podobne do systemu Unix (MacOSX, Linux, ...) używają /.

Jeśli potrzebujesz więcej pomocy dołącz przez MOZ jsctypes kanał IRC :)

+0

Pozdrawiam za udostępnione linki! Pomogło mi to uporządkować moje rzeczy :) Połączy się z Tobą na kanale, aby dowiedzieć się więcej na temat Add-on. Dużo więcej złamałem sobie głowę dzięki XPCOM. Dzięki jeszcze raz. –

+0

self.data.url ("someFile.dll") w ctypes.open daje błąd, ponieważ nie może otworzyć zasobów biblioteki: // .... –

+3

Sam to rozwiązałem za pomocą var dataUrl = self.data.url ("udp_client.dll"); dataUrl = Services.io.newURI (dataUrl, null, null) .QueryInterface (Ci.nsIFileURL) .file.path ;. Dzięki –