//////////////////
//Lu动态库唯一的输出函数
//iInit!=0时,进行初始化。LuDll32=0:初始化失败;LuDll32=1:初始化成功;LuDll32=2:初始化成功,仅注册一些常量,初始化完成后可卸载该库。
//iInit=0时,LuDll32=0:释放失败;LuDll32=1:释放成功。
extern "C" int _stdcall LuDll32(HINSTANCE hLU,int iInit,void *me)
{
int i;
if(iInit) //初始化动态库
{
hLu=hLU;
pSetFunction=(luSetFunction) GetProcAddress(hLu,"SetFunction");
pSetConst=(luSetConst) GetProcAddress(hLu,"SetConst");
pDeleteKey=(luDeleteKey) GetProcAddress(hLu,"DeleteKey");
//注册二级函数
for(i=0;FunName[i][0];i++)
{
FunReg[i]=pSetFunction(FunName[i],FunCal[i],FunPara[i]) false:true;
if(!FunReg[i]) MessageBox(NULL,FunName[i],L"DllExample 注册函数失败!",32);
}
//注册常量
LuData a;
a.BType=luStaData_double; a.VType=luStaData_double; *(double *)&(a.x)=3.1416;
pSetConst(L"pi",&a);
return 1;
}
else //释放动态库
{
//注销二级函数
for(i=0;FunName[i][0];i++)
{
if(FunReg[i]) pDeleteKey((char *)FunName[i],wcslen(FunName[i])*2,luKey_Function,NULL,0);
}
//注销常量
pDeleteKey((char *)L"pi",4,luKey_Const,NULL,0);
return 1;
}
}
////////////////////////////////////////////////////二级函数定义
LuData _stdcall lu_Add(luINT mm,LuData *xx,void *vFor) //两个数相加
{
LuData a;
if(xx->VType==luStaData_int64 && (xx+1)->VType==luStaData_int64)
{
a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=xx->x+(xx+1)->x;
}
else if(xx->VType==luStaData_double && (xx+1)->VType==luStaData_double)
{
a.BType=luStaData_double; a.VType=luStaData_double; *(double *)&(a.x)=*(double *)&(xx->x)+*(double *)&((xx+1)->x);
}
else
{
a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;
}
return a;
}
LuData _stdcall lu_Sub(luINT mm,LuData *xx,void *vFor) //两个数相减
{
LuData a;
if(xx->VType==luStaData_int64 && (xx+1)->VType==luStaData_int64)
{
a.BType=luStaData_int64; a.VType=luStaData_int64; a.x=xx->x-(xx+1)->x;
}
else if(xx->VType==luStaData_double && (xx+1)->VType==luStaData_double)
{
a.BType=luStaData_double; a.VType=luStaData_double; *(double *)&(a.x)=*(double *)&(xx->x)-*(double *)&((xx+1)->x);
}
else
{
a.BType=luStaData_nil; a.VType=luStaData_nil; a.x=0;
}
return a;
}
4 函数说明
本例用到了Lu的3个输出函数:设置外部二级函数SetFunction、设置常量函数SetConst、删除一个键DeleteKey。从这里查看这些函数的说明:Lu编程指南。
5 难点分析
本文仅用来说明如何用C/C++设计Lu扩展动态库,并给出了一个简单例子,关于如何加载使用本文生成的DllExample.dll,参考下一篇教程C/C++使用Lu扩展动态库。
在Lu32脚本系统中,已经实现的主要Lu扩展库参考Lu脚本系统说明,源代码下载:lu1code.rar。
6 其他
你可能注意到了,我的联系方式就在下面,如有不明之处或有什么建议,可随时与我进行联系。
版权所有 Lu程序设计 2002-2013,保留所有权利
E-mail: forcal@sina.com QQ:630715621
最近更新: 2014年01月15日