JS 炫彩JS扩展模块开发

炫彩JS扩展模块开发

  1. 使用VS新建一个DLL项目
  2. 写入模块开发接口申明代码
  3. 新建def文件,导出模块初始化函数 InitModule()
  4. 开发模块为JS提供扩展API
  5. 使用JS代码测试模块

模块开发接口申明

#ifndef interface
#define interface struct
#endif
//模块操作接口
interface CModule
{
const wchar_t* _funName;
virtual int GetArgsCount() = 0; //获取回调参数数量
virtual BOOL IsNumber(int index) = 0;//获取参数类型
virtual BOOL IsString(int index) = 0;
virtual BOOL IsBool(int index) = 0;
virtual BOOL IsFunction(int index) = 0;
virtual BOOL IsObject(int index) = 0;
virtual int GetNumber(int index) = 0;
virtual BOOL GetBool(int index) = 0;
virtual const wchar_t* GetString(int index) = 0;
virtual void FreeString(const wchar_t* pString) = 0;
virtual void SetReturnValueNumber(int nValue) = 0;
virtual void SetReturnValueString(const wchar_t* strValue) = 0;
};
typedef void(CALLBACK *module_clallback)(CModule *module_);
typedef BOOL(CALLBACK *fun_Bind)(void* module_, const wchar_t* pFunName);
typedef BOOL(CALLBACK *fun_RegCallback)(void* module_, module_clallback fun);//注册回调函数

使用def文件导出模块初始化函数

LIBRARY XCGUI_JS_EX
EXPORTS
InitModule

模块开发示例代码

#include <map>
#include <functional>
/*****************************
* 炫彩JS扩展模块开发示例
*/
//演示绑定的函数
void module_add(CModule* module_)
{
if (2 != module_->GetArgsCount()) return;
if (!module_->IsNumber(0)) return;
if (!module_->IsNumber(1)) return;
int a =module_->GetNumber(0);
int b = module_->GetNumber(1);
module_->SetReturnValueNumber(a+b);
}
//演示绑定的函数
void module_getText(CModule* module_)
{
if (1 != module_->GetArgsCount()) return;
if (!module_->IsString(0)) return;
const wchar_t* s = module_->GetString(0);
module_->SetReturnValueString(s);
module_->FreeString(s);
}
//函数名映射map
std::map<std::wstring, void(*)(CModule*)> g_map;
//函数统一回调
void CALLBACK module_clallback_(CModule* module_)
{
std::map<std::wstring, void(*)(CModule*)>::const_iterator iter= g_map.find(module_->_funName);
if(iter != g_map.end())
iter->second(module_);
}
//绑定函数并添加到map映射
#define bind_fun(name, fun) bind_(module_, name); g_map[name]=fun
//模块初始化函数
extern "C" BOOL WINAPI InitModule(void* module_, fun_Bind bind_, fun_RegCallback reg_callback_)
{
bind_fun(L"add", module_add); //bind_(module_, L"add"); g_map[L"add"] = module_add;
bind_fun(L"getText", module_getText);
reg_callback_(module_, module_clallback_);
return TRUE;
}

JS中调用模块 XCGUI_JS_EX.dll

var xc_js_ex = import('XCGUI_JS_EX.dll'); //导入JS扩展DLL
var ret = xc_js_ex.add(3,4); //调用模块中的函数
alert(ret); //弹出显示返回结果
ret = xc_js_ex.getText();
alert(ret);