2013-05-05 1 views

답변

7

C 함수에서 함수 포인터가 있다면 FunctionType에 대한 포인터로 올바르게 해석되었는지 확인해야합니다. 그런 다음 JavaScript 함수처럼 간단하게 호출 할 수 있습니다.

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); 
: - 예를 들어, GetProcAddress() 함수 포인터를 반환 내가 반환 유형으로 무효 포인터로 GetProcAddress()를 선언 다음 코드를 다음 나는 MessageBox() 함수의 서명과 일치하는 함수 타입에 그 포인터를 캐스팅