【问题标题】:How to call a function using pointer in js-ctypes如何使用 js-ctypes 中的指针调用函数
【发布时间】:2013-04-29 05:07:42
【问题描述】:

我只有一个函数的指针,js-ctypes中怎么调用?

谢谢。

【问题讨论】:

    标签: firefox-addon jsctypes


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多