5

私は関数へのポインタしか持っていません.js-ctypesでそれを呼び出す方法は?

ありがとう。

4

1 に答える 1

7

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);
于 2013-05-05T11:38:34.910 に答える