C/C++调用MLu的入门程序(一)

2014-11-24 12:41:16 · 作者: · 浏览: 2

MLu是程序和Lu核心库之间的一个接口库,MLu会自动加载Lu核心库和动态加载多个Lu扩展库,简化了Lu系统的使用;MLu可对Lu源程序进行模块化编译,能够编译运行具有固定格式的源程序(字符串表达式),源程序中可以使用C++风格的注释。此外,MLu还提供了多个线程互斥地访问Lu资源的功能;提供了Lu运行监视器,以退出耗时较长的程序;提供在脚本中动态编译函数的功能;提供错误处理函数,实现错误(异常)处理的恢复模型等等。

1 隐式加载例子

该例子需要以下支持文件:

(1)头文件lu32.h。

(2)导入库lu32.lib及mlu32.lib。

(3)核心库lu32.dll和模块化编译运行库mlu32.dll。

#include <windows.h>

#include

#include "lu32.h" //Lu头文件

#pragma comment( lib, "lu32.lib" )

#pragma comment( lib, "mlu32.lib" )

using namespace std;

void main(void)

{

void *hModule; //模块句柄

luINT ErrBegin,ErrEnd; //表达式编译出错的初始位置和结束位置

int i; //错误代码

void *hFor; //表达式句柄

luVOID nModule=0; //表达式所在模块

void *vPara; //存放输入自变量的数组指针

LuData *pPara; //存放输入自变量的数组指针

luINT nPara; //存放表达式的自变量个数

LuData Val; //存放表达式的值

wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;"; //Lu模块化源程序

if(!InitMLu()) return; //初始化MLu

if(!UseLu(2)) //申请使用Lu资源

{

i=ComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd); //编译Lu源程序

if(i)

{

cout<<"Lu源程序有错误!错误代码:"<

}

else

{

if(GetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara)) //查找全局函数

{

pPara=(LuData *)vPara;

for(i=0;i<=nPara;i++) //表达式自变量赋值,均赋值为1

{

pPara[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;

}

Val=LuCal(hFor,pPara); //计算表达式的值

cout<

}

else

{

cout<<"找不到指定的函数!"<

}

}

UseLu(0); //归还Lu的使用权

}

FreeMLu(); //释放MLu

}

结果:

3

请按任意键继续. . .

2 显式加载例子

该例子需要以下支持文件:

(1)头文件lu32.h。

(2)核心库lu32.dll和模块化编译运行库mlu32.dll。

#include

#include

#include "Lu32.h"

using namespace std;

HINSTANCE hMLu=NULL; //动态库MLu32.dll的句柄

//MLu输出函数

mluInitMLu pInitMLu;

mluFreeMLu pFreeMLu;

mluGetLuProc pGetLuProc;

mluUseLu pUseLu;

mluComModule pComModule;

//Lu输出函数

luGetFor pGetFor;

luLuCal pLuCal;

bool theInitMLu(void) //初始化MLu

{

hMLu=LoadLibrary(L"MLu32.dll"); //加载动态库MLu32.dll

if(!hMLu)

{

cout<<"找不到MLu32.dll!请将该库放到WINDOWS的搜索路径内!";

return false;

}

//以下几个语句获取MLu32.dll的输出函数

pInitMLu=(mluInitMLu) GetProcAddress(hMLu,"InitMLu");

pFreeMLu=(mluFreeMLu) GetProcAddress(hMLu,"FreeMLu");

pGetLuProc=(mluGetLuProc) GetProcAddress(hMLu,"GetLuProc");

pUseLu=(mluUseLu) GetProcAddress(hMLu,"UseLu");

pComModule=(mluComModule) GetProcAddress(hMLu,"ComModule");

if(!pInitMLu()) //初始化MLu32.dll

{

FreeLibrary(hMLu); //释放动态库

cout<<"MLu初始化失败!";

return false;

}

//以下几个语句获取Lu32.dll的输出函数

pGetFor=(luGetFor) pGetLuProc("GetFor");

pLuCal=(luLuCal) pGetLuProc("LuCal");

return true;

}

void theFreeMLu(void) //释放MLu

{

pFreeMLu(); //释放MLu申请的空间

FreeLibrary(hMLu); //释放动态库

}

void main(void)

{

void *hModule; //模块句柄

luINT ErrBegin,ErrEnd; //表达式编译出错的初始位置和结束位置

int i; //错误代码

void *hFor; //表达式句柄

luVOID nModule=0; //表达式所在模块

void *vPara; //存放输入自变量的数组指针