導入 ctypes.jsm方法如下:
Components.utils.import("resource://gre/modules/ctypes.jsm")
加載本地庫
導入了代碼模塊之後,可以使用ctypes.open()方法來加載本地庫了。加載user32庫方式如下:var lib = ctypes.open("user32.dll");返回的是一個Library對象,你可以用它來聲明所加載的函數庫要使用的函數和數據類型。
Js-ctypes只能使用C庫,不可以直接使用C++庫,但是你可以用C函數封裝一個調用了C++庫的函數庫來使用。
庫的搜索路徑
在windows下,搜索順序如下:- The application's directory.
- The system directory.
- The 16-bit system directory.
- The Windows directory.
- The current working directory
- The directories listed in the PATH environment variable.
完成之後
使用完一個庫之後,需要調用Library對象的close方法來關閉:lib.close();如果沒有成功關閉,則會在垃圾回收時進行自動關閉。
使用庫
可能需要聲明新的類型(簡單類型或者複雜類型如:結構體)。詳情見聲明類型,基本上都需要聲明一個或多個函數,那樣纔可用調用它們。一旦聲明瞭類型和函數,你就可以編寫代碼來使用它們了,C數據對象的示例及參考在文章使用數據一文中。
聲明類型
上述內容位於此處聲明並調用函數
上述內容位於此處使用數據
上述內容位於此處內存管理
如果JS代碼創建了一個結構體或者數組,其內存就會在該對象存在期間可用。那片內存的指針必須進行諮詢的管理,以確保該內存仍然有效。當二進制代碼交回一個分配內存的指針或句柄,JS代碼必須確保在正確的地方進行釋放。通常最好的方式是在二進制代碼庫中添加一個釋放函數。
保持對象存在
下面的js-ctypes對象將會保持對象的引用,保持它們的存在。這不是一個詳細的清單,但是可以幫助你理解內存管理以及如何影響你對js-ctypes的使用。使用declare()方法聲明的函數或static數據會使得那個library存在
一個CType會保持其指示的CType對象存在
一個CData會在特定的環境中保持其指示的CData對象存在,例如:訪問某個結構體或者數組內部的數據產生的CData對象會保持對應的對象存在
什麼不會保持對象存在
非常需要注意的地方是使用address()方法,和addressOfElement()方法,或者contents直接訪問一個CData對象的內容得到的結果是一個CData對象,這個對象並沒有保持其應用的存在。。確保一個對象有一個明確的引用以使其不會在你使用完之前被回收。結論
你還需要確保對任何本地代碼可能從新調用的javascript代碼的引用的獲取。這很明顯,但是值得明確的指出來。不確定的時候 malloc()
當你絕對的需要保持數據的存在時,你可以使用malloc()來直接分配內存。這不由javascript來進行內存管理,需要你自己對內存進行管理。
例子
略參見原文