如何在js-ctypes中使用指针调用一个函数 [英] How to call a function using pointer in js-ctypes

查看:159
本文介绍了如何在js-ctypes中使用指针调用一个函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


$ b

谢谢。

解决方案

如果你有一个C函数的函数指针,那么你需要确保它被正确地解释为指向 FunctionType 。然后,您可以简单地调用它,就像您将使用JavaScript函数一样。例如, GetProcAddress()返回一个函数指针 - 在下面的代码中,我用void指针声明 GetProcAddress作为返回类型,然后我将该指针转换为匹配 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,//返回类型
LPCTSTR //参数
) ;
var FreeLibrary = kernel.declare(
FreeLibrary,
ctypes.winapi_abi,
BOOL,//返回类型
HMODULE //参数
) ;
var GetProcAddress = kernel.declare(
GetProcAddress,
ctypes.winapi_abi,
FARPROC,//返回类型
HMODULE,LPCSTR //参数
);

//加载我们感兴趣的库
var hUser = LoadLibrary(user32);

//获取指向函数的指针。
var MessageBox = GetProcAddress(hUser,MessageBoxW);

//现在我们有一个指向函数的指针,让我们把它转换成正确的类型。
var MessageBoxType = ctypes.FunctionType(
ctypes.winapi_abi,
ctypes.int32_t,//返回类型
[HWND,LPCTSTR,LPCTSTR,ctypes.uint32_t] //参数
);
MessageBox = ctypes.cast(MessageBox,MessageBoxType.ptr);

//实际上调用函数。
MessageBox(null,Test1,Test2,0);

//如果不再需要,再次释放库。任何导入的函数
//指针在这里都应该被认为是无效的。
FreeLibrary(hUser);


I only have a pointer to a function, how to call it in js-ctypes?

Thanks.

解决方案

If you got a function pointer from a C function then you need to make sure it's correctly interpreted as a pointer to FunctionType. Then you can simply call it as you would a JavaScript function. For example, GetProcAddress() returns a function pointer - in the following code I declare GetProcAddress() with a void pointer as return type, then I cast that pointer to a function type matching the signature of the MessageBox() function:

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

这篇关于如何在js-ctypes中使用指针调用一个函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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