Я разрабатываю плагин 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*)
но я не могу объявить fgets
. Я до сих пор не могу понять. Я пытаюсь сделать:
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)»
fopen
и т. д., если этого можно избежать. Уже существует множество API доступа к файлам, таких какnsIFileInputStream
илиOS.File
, которые не только являются кроссплатформенными и активно используются Firefox и другими -ons, но также проще в использовании и надежнее, чем возиться с js-ctypes. - person nmaier   schedule 22.02.2014