炫彩JS扩展模块开发
- 使用VS新建一个DLL项目
- 写入模块开发接口申明代码
- 新建def文件,导出模块初始化函数 InitModule()
- 开发模块为JS提供扩展API
- 使用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>
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);
}
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_);
}
#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_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');
var ret = xc_js_ex.add(3,4);
alert(ret);
ret = xc_js_ex.getText();
alert(ret);