摘要:虽然点点的内核功能仍然在不断的增加中,但毕竟不能一下就完善起来,所以在遇到无法实现的功能时,还是需要你自己编写扩展来实现想要的功能。
虽然如此,不过也不要怕,因为编写一个扩展真的是一件非常简单的事情,只需根据下面的步骤一步一步操作即可,不过需要一些C和C++的功底
虽然点点的内核功能仍然在不断的增加中,但毕竟不能一下就完善起来,所以在遇到无法实现的功能时,还是需要你自己编写扩展来实现想要的功能。
虽然如此,不过也不要怕,因为编写一个扩展真的是一件非常简单的事情,只需根据下面的步骤一步一步操作即可,不过需要一些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});
写一个扩展并调用,是不是非常简单。:)