FF插件:如何在JavaScript中声明的C函数与fgets [英] FF addon: How to declare C function fgets in javascript

查看:122
本文介绍了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 我设法读取文件。<​​/ P>

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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆