2015-02-09 86 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

相关问题