2015-02-09 98 views
9

我想構建一個Firefox擴展,需要調用本地C代碼。如何使用js-ctypes Firefox擴展調用本地C代碼?

我的C程序代碼是:

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

和我的JavaScript代碼是:

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; 
調用 binaryFile功能時

,我得到的錯誤

Couldn't find function symbol in library 

請幫我出。 tHanks提前。

+0

不應該使用'int'而不是'int32_t'嗎? – meskobalazs 2015-02-09 13:43:01

回答

6

這裏是我的repository其中提供了完整的代碼

5

如果你的插件是無重啓的插件,請確保設置爲<em:unpack>true</em:unpack>。插件必須解壓縮。

太棒了,你已經深入到插件!看到這個回購:https://github.com/Noitidart/fx-sapi-test它顯示了編譯到DLL中,然後導入和使用的main.cpp代碼。你必須公開你的add函數。順便說一句,如果你正在做一個引導程序插件:還可以試着在startup()函數內部執行ctypes.open。但你不是,你正在做一個Addon SDK插件,所以你應該沒問題。但對於你的進口,請這樣做:

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

這樣你就不必知道絕對路徑。特別是因爲\\文件分隔符只適用於Windows。 Unix系統(MacOSX,Linux,...)使用/

如果您需要更多的幫助加入MOZ jsctypes IRC頻道:)

+0

爲共享鏈接歡呼!幫助我得到我的東西排序:)將連接到您的頻道,以瞭解更多的附加組件。 XPCOM已經讓我頭痛不已。再次感謝。 – 2015-02-10 05:45:57

+0

ctypes.open中的self.data.url('someFile.dll')給出錯誤,因爲無法打開庫資源:// ... – 2015-02-10 07:02:46

+3

我自己通過使用var dataUrl = self.data.url ( 「udp_client.dll」); dataUrl = Services.io.newURI(dataUrl,null,null).QueryInterface(Ci.nsIFileURL).file.path ;.謝謝 – 2015-02-10 09:02:14