2013-05-05 12 views
5

में पॉइंटर का उपयोग करके फ़ंक्शन को कॉल करने के लिए कैसे करें मेरे पास केवल एक फ़ंक्शन के लिए पॉइंटर है, इसे जेएस-सीटीपीएस में कैसे कॉल करें?जेएस-सीटीपीएस

धन्यवाद।

उत्तर

7

यदि आपको सी फ़ंक्शन से फ़ंक्शन पॉइंटर मिला है तो आपको यह सुनिश्चित करना होगा कि इसे FunctionType पर पॉइंटर के रूप में सही ढंग से व्याख्या किया गया हो। फिर आप इसे आसानी से कॉल कर सकते हैं क्योंकि आप जावास्क्रिप्ट फ़ंक्शन करेंगे। उदाहरण के लिए, GetProcAddress() एक समारोह सूचक रिटर्न - निम्नलिखित कोड में मैं वापसी प्रकार के रूप में एक शून्य सूचक के साथ 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, // 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); 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^