精靈點點基礎教程5 -- 編寫擴展程序

摘要:雖然點點的內核功能仍然在不斷的增長中,但畢竟不能一下就完善起來,因此在遇到沒法實現的功能時,仍是須要你本身編寫擴展來實現想要的功能。  javascript

雖然如此,不過也不要怕,由於編寫一個擴展真的是一件很是簡單的事情,只需根據下面的步驟一步一步操做便可,不過須要一些C和C++的功底html


目錄    

精靈點點簡明教程1 -- 下載與安裝java

精靈點點簡明教程2 -- 基本操做json

精靈點點簡明教程3 -- 錄製腳本數據結構

精靈點點簡明教程4 -- 編輯與調試腳本ide

精靈點點簡明教程5 -- 編寫擴展程序函數

精靈點點簡明教程6 -- 發佈腳本url

精靈點點簡明教程7 -- 自建窗體調試


 

編寫擴展程序

雖然點點的內核功能仍然在不斷的增長中,但畢竟不能一下就完善起來,因此在遇到沒法實現的功能時,仍是須要你本身編寫擴展來實現想要的功能。  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});

寫一個擴展並調用,是否是很是簡單。:)           

相關文章
相關標籤/搜索