精灵点点基础教程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});

写一个扩展并调用,是否是很是简单。:)           

相关文章
相关标签/搜索