摘要:雖然點點的內核功能仍然在不斷的增長中,但畢竟不能一下就完善起來,因此在遇到沒法實現的功能時,仍是須要你本身編寫擴展來實現想要的功能。 javascript
雖然如此,不過也不要怕,由於編寫一個擴展真的是一件很是簡單的事情,只需根據下面的步驟一步一步操做便可,不過須要一些C和C++的功底html
雖然點點的內核功能仍然在不斷的增長中,但畢竟不能一下就完善起來,因此在遇到沒法實現的功能時,仍是須要你本身編寫擴展來實現想要的功能。 code
雖然如此,不過也不要怕,由於編寫一個擴展真的是一件很是簡單的事情,只需根據下面的步驟一步一步操做便可,不過須要一些C和C++的功底。
1. 首先咱們打開精靈點點的安裝根目錄。
2. 進入ExtensionSources目錄,會在裏面有一個名爲ACExtendDemo的目錄,點進去雙擊ACExtendDemo.sln,這是一個VS2010的示例解決方案。
3. 打開解決方案後,打開dllmain.cpp,擴展程序的源文件都在這裏面了
下面咱們將dllmain.cpp的主要內容粘帖在下面,仔細看裏面的註釋。
// 由於從V8引擎傳過來的字符都是UTF8,而咱們的工程選擇的是UNICODE字符集,因此須要相互的轉化函數 char* UnicodeToUTF8(const wchar_t* wp){ // 具體內容看源代碼 }; // UnicodeToUTF8的逆向 WCHAR* UTF8ToUnicode(const char* c){ // 具體內容看源代碼 }; // 將字符串解析成JSON對象 Json::Value ParseJson(WCHAR* json){ // 具體內容看源代碼 }; /************************************************************************** 方法描述:真正的導出函數,在咱們的腳本里被調用的函數 參數: params 點點擴展函數的參數只有一個就是字符型的params,能夠是任意的字符串 若是須要傳遞的參數是複雜的數據結構,可使用JSON字符串的方式傳入,在這個擴展函數 裏的params就相似是這樣的結構 "{a:3,b:6}" 返回值:點點擴展函數的返回值均爲字符串,若是須要返回複雜的結構,能夠將結構體轉化 爲JSON字符串返回 **************************************************************************/ extern "C" __declspec(dllexport) WCHAR* Sum(WCHAR *params){ // 假如 params爲字符串 "{a:3,b:6}" // 解析JSON字符串 Json::Value p = ParseJson(params); // 獲取a的值,此時爲3 int a = p["a"].asInt(); // 獲取b的值,此時爲6 int b = p["b"].asInt(); // 兩數相加,c=9 int c = a + b; // 將計算結果轉化爲字符串返回 WCHAR *r = new WCHAR[12]; wsprintf(r, L"%d", c); return r; }; // 返回JSON字符串的狀況 extern "C" __declspec(dllexport) WCHAR* GetPoint(WCHAR *params){ return L"{\"x\":12,\"y\":8}"; }; // 直接執行操做的狀況 extern "C" __declspec(dllexport) WCHAR* OpenUrl(WCHAR *params){ WCHAR * url = params; ::ShellExecute(NULL, L"open", L"explorer", url, NULL, SW_SHOW); return L""; };
而後咱們將此工程編譯,此時會生成一個名爲ACExtensionDemo.dll的文件 ,將此文件拷貝到安裝目錄下的Extensions裏。
這樣咱們就能夠在腳本中調用剛纔寫的擴展方法了,咱們這裏以調用extern "C" __declspec(dllexport) WCHAR* Sum(WCHAR *params)這個方法爲例來講明一下。
腳本應該象這樣寫
// 構造擴展方法的對象,其中函數爲DLL的名字 var aed = ex("ACExtensionDemo"); // 調用Sum方法,其中第一個參數爲方法名,第二個爲參數,此參數會被做爲params傳遞給DLL裏的Sum方法,回想一下剛纔擴展裏面的SUM方法的註釋。 // 此方法執行完成後ret的值爲9. var ret = aed.call('sum','{a:3,b:6}'); // 雖然講在DLL裏方法的參數PARAMS必須爲字符串,但在腳本里咱們仍然能夠以下面的調用方式,這種狀況JSON對象會被自動轉化爲字符串傳遞給DLL的擴展方法 var ret1 = aed.call('sum',{a:3,b:6});
寫一個擴展並調用,是否是很是簡單。:)