Разработвам плъгин за 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