FF插件:如何在javascript中声明C函数fgets



我正在开发firefox插件,我想使用WinApi读取文件。我设法与WinApi连接,它运行良好。

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*)

但我没有申报CCD_ 2。我还是想不通。我试着做:

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);` 

我想我没有使用错误的库,因为那样我会得到错误"错误:在库中找不到函数符号",但我仍然得到"TypeError:预期的类型指针,得到(void 0)">

下面是一组不同ctype声明的示例:https://builder.addons.mozilla.org/package/161408/latest/

如果你仍然搞不清楚,把它贴出来,我会努力让fget工作起来。

但建议使用namer,使用跨平台选项是最好的,但为了学习,如果你不知道,我们可以在我有时间的时候做这个fget

这是我的解决方案。我决定使用getc函数而不是fgets,并且我设法读取了文件。

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;
}

好吧,我有一些时间,所以我玩了它,我需要你的帮助来修复它。

这是你的版本,我修好了。将其复制粘贴到草稿栏,设置为环境>浏览器并运行

Cu.import("resource://gre/modules/ctypes.jsm");
var libc = ctypes.open("msvcrt.dll");
var FILE = new ctypes.StructType("FILE").ptr; //made var otherwise in scratchpad cant run multiple times, this can be CONST its no issue
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*)

var fgets = libc.declare("fgets",                    
ctypes.default_abi,           
ctypes.char.ptr,              
ctypes.char.ptr,              
ctypes.int32_t,               
FILE);          

var myfile = fopen("C:\Users\3K2KYC1\Desktop\FirefoxPortable\newfile.in", "r");
var SIZE = 100;
var line = new ctypes.char(SIZE);
var ret = fgets(line.address(), SIZE, myfile);   

Services.wm.getMostRecentWindow(null).alert(line);
Services.wm.getMostRecentWindow(null).alert(ret);

本次测试结果:

  • newfile.in已存在,其内容为"ABC"无引号
  • 行-运行代码后,行被设置为"ctypes.char(65)",65是A的字符代码,但如何读取行
  • ret-在运行代码ret被设置为"ctypes.char.ptr(ctypes.UInt64("0x1e70e808")"之后,这对我来说也没有意义,你如何从中获得字符串

然后我改了一些东西,按照自己的方式做了,但我也遇到了类似的问题——我不能读多个字符。

Cu.import("resource://gre/modules/ctypes.jsm");
var libc = ctypes.open("msvcrt.dll");

var struct_FILE = new ctypes.StructType("FILE"); //set to var only so can run multiple times in scratchpad, can change back to const
var fopen = libc.declare("fopen", // symbol name
ctypes.default_abi, // cdecl calling convention
struct_FILE.ptr, // return type (FILE*)
ctypes.char.ptr, // first arg (const char*)
ctypes.char.ptr); // second arg (const char*)
var fgetc = libc.declare("fgetc", // symbol name
ctypes.default_abi, // cdecl calling convention
ctypes.int.ptr, // return type (FILE*)
struct_FILE.ptr); // second arg (const char*)
var fgets = libc.declare("fgets", // symbol name
ctypes.default_abi, // cdecl calling convention
ctypes.jschar.ptr, // return char pointer
ctypes.jschar.ptr, // first arg char pointer
ctypes.int, //second arg int
struct_FILE.ptr); // third arg FILE pointer
var myfile = fopen("C:\Users\3K2KYC1\Desktop\FirefoxPortable\newfile.in", "r");
//Services.wm.getMostRecentWindow(null).alert(myfile);

var line = new ctypes.jschar;
var ret = fgets(line.address(), 2, myfile);
Services.wm.getMostRecentWindow(null).alert(line);
Services.wm.getMostRecentWindow(null).alert(ret);
  • newfile.in已存在,其内容为"ABC"无引号
  • 在第30行使用大小2作为第2个参数
  • line-设置为"ctypes.jschar("A")",没有引号,这是文件中的第一个字符,但我说get 2 char为什么不给前2个字符?如果try 3,它会给出一些奇怪的东西
  • ret-设置为"ctypes.jschar.ptr(ctypes.UInt64("0xfba2b32")">

  • 如果使用3 大小

  • line-"ctypes.jschar("\u4241")">
  • ret-"ctypes.jschar.ptr(ctypes.UInt64("0x8fefce8")">

最新更新