Как вызвать функцию с помощью указателя в js-ctypes

У меня есть только указатель на функцию, как ее вызвать в js-ctypes?

Спасибо.


person yume_chan    schedule 05.05.2013    source источник


Ответы (1)


Если вы получили указатель функции из функции C, вам нужно убедиться, что он правильно интерпретируется как указатель на FunctionType. Затем вы можете просто вызвать его, как функцию JavaScript. Например, GetProcAddress() возвращает указатель на функцию — в следующем коде я объявляю GetProcAddress() с указателем void в качестве возвращаемого типа, затем я привожу этот указатель к типу функции, соответствующему сигнатуре функции MessageBox():

Components.utils.import("resource://gre/modules/ctypes.jsm");

var BOOL = ctypes.int32_t;
var HANDLE = ctypes.voidptr_t;
var HMODULE = HANDLE;
var HWND = HANDLE;
var FARPROC = ctypes.voidptr_t;
var LPCTSTR = ctypes.jschar.ptr;
var LPCSTR = ctypes.char.ptr;

var kernel = ctypes.open("kernel32.dll");
var LoadLibrary = kernel.declare(
    "LoadLibraryW",
    ctypes.winapi_abi,
    HMODULE, // return type
    LPCTSTR // parameters
);
var FreeLibrary = kernel.declare(
    "FreeLibrary",
    ctypes.winapi_abi,
    BOOL, // return type
    HMODULE // parameters
);
var GetProcAddress = kernel.declare(
    "GetProcAddress",
    ctypes.winapi_abi,
    FARPROC, // return type
    HMODULE, LPCSTR // parameters
);

// Load the library we're interested in.
var hUser = LoadLibrary("user32");

// Get the pointer to the function.
var MessageBox = GetProcAddress(hUser, "MessageBoxW");

// Now we have a pointer to a function, let's cast it to the right type.
var MessageBoxType = ctypes.FunctionType(
    ctypes.winapi_abi,
    ctypes.int32_t, // return type
    [HWND, LPCTSTR, LPCTSTR, ctypes.uint32_t] // parameters
);
MessageBox = ctypes.cast(MessageBox, MessageBoxType.ptr);

// Actually call the function.
MessageBox(null, "Test1", "Test2", 0);

// Free the library again if no longer needed. Any imported function
// pointers should be considered invalid at this point.
FreeLibrary(hUser);
person Wladimir Palant    schedule 05.05.2013