本文介绍了FF插件:如何在JavaScript中声明的C函数与fgets的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在开发的Firefox插件,我想用WINAPI读取文件。
我设法与WINAPI连接并正常工作。
I'm developing firefox plugin and I want to read file using WinApi.I manage to connect with WinApi and it works fine.
var lib = ctypes.open("user32.dll");
var msgBox = lib.declare("MessageBoxW",
ctypes.winapi_abi,
ctypes.int32_t,
ctypes.int32_t,
ctypes.jschar.ptr,
ctypes.jschar.ptr,
ctypes.int32_t);
var MB_OK = 0;
var ret = msgBox(0, "Hello world", "title", MB_OK);
现在我宣布的fopen
:
const FILE = new ctypes.StructType("FILE").ptr;
var fopen = libc.declare("fopen", // symbol name
ctypes.default_abi, // cdecl calling convention
FILE, // return type (FILE*)
ctypes.char.ptr, // first arg (const char*)
ctypes.char.ptr); // second arg (const char*)
但我不声明与fgets
。我仍然无法弄清楚。我尝试做的:
but I fail to declare fgets
. I still can't figure it out. I try to do:
var libc = ctypes.open("msvcrt.dll");
var fgets = libc.declare("fgets",
ctypes.default_abi,
ctypes.char.ptr,
ctypes.char.ptr,
ctypes.int32_t,
FILE);
// Call the function, and get a FILE* pointer object back.
console.log(LOG_FILTER, "Try to open file.");
var file1 = fopen("1.in", "r");
var SIZE = 100;
var line = ctypes.char(SIZE).ptr;
line = fgets(line, SIZE, file1);`
我想我不要用错库,因为那时我会得到错误错误:在库中找不到函数符号,但我仍然得到类型错误:预期类型的指针,得到(无效0)
I think I don't use wrong library because then I would get error "Error: couldn't find function symbol in library" but I still get "TypeError: expected type pointer, got (void 0)"
推荐答案
因此,这里是我的解决方案。我决定用 GETC
函数代替与fgets
我设法读取文件。
So here is my solution. I decided to use getc
function instead of fgets
and I manage to read file.
Components.utils.import("resource://gre/modules/ctypes.jsm");
var libc = ctypes.open("msvcrt.dll");
// int getc(FILE *stream);
var getc = libc.declare("getc",
ctypes.default_abi,
ctypes.int32_t,
FILE);
var file = fopen("newfile.in", "w");
var readFile = readFileToString(file)
function readFileToString(file) {
var result = '';
var c = 0;
while((c = getc(file)) != -1) {
result += String.fromCharCode(c);
}
console.log("result = " + result);
return result;
}
这篇关于FF插件:如何在JavaScript中声明的C函数与fgets的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!