forcal 发表于 2011-10-30 20:17

C/C++调用MLu的入门程序

C/C++调用MLu的入门程序
    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 <iostream>
#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源程序有错误!错误代码:"<<i<<endl;
                }
                else
                {
                        if(GetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))        //查找全局函数
                        {
                                pPara=(LuData *)vPara;
                                for(i=0;i<=nPara;i++)        //表达式自变量赋值,均赋值为1
                                {
                                        pPara.BType=luStaData_int64; pPara.VType=luStaData_int64; pPara.x=1;
                                }
                                Val=LuCal(hFor,pPara);        //计算表达式的值
                                cout<<Val.x<<endl;
                        }
                        else
                        {
                                cout<<"找不到指定的函数!"<<endl;
                        }
                }
                UseLu(0);                //归还Lu的使用权
        }
        FreeMLu();                //释放MLu
}结果:3
请按任意键继续. . .2 显式加载例子

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

    (1)头文件lu32.h。
    (2)核心库lu32.dll和模块化编译运行库mlu32.dll。#include <windows.h>
#include <iostream>
#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;                //存放输入自变量的数组指针
        LuData *pPara;                //存放输入自变量的数组指针
        luINT nPara;                //存放表达式的自变量个数
        LuData Val;                //存放表达式的值
        wchar_t ForStr[]=L"f(x)=x+1; :::ff(x,y)=f(x)+y;";        //Lu模块化源程序
        if(!theInitMLu()) return;        //初始化MLu
        if(!pUseLu(2))                //申请使用Lu资源
        {
                i=pComModule(ForStr,nModule,hModule,ErrBegin,ErrEnd);        //编译Lu源程序
                if(i)
                {
                        cout<<"Lu源程序有错误!错误代码:"<<i<<endl;
                }
                else
                {
                        if(pGetFor(L"ff",1,NULL,nModule,hFor,vPara,nPara))
                        {
                                pPara=(LuData *)vPara;
                                for(i=0;i<=nPara;i++)        //表达式自变量赋值,均赋值为1
                                {
                                        pPara.BType=luStaData_int64; pPara.VType=luStaData_int64; pPara.x=1;
                                }
                                Val=pLuCal(hFor,pPara);        //计算表达式的值
                                cout<<Val.x<<endl;
                        }
                        else
                        {
                                cout<<"找不到指定的函数!"<<endl;
                        }
                }
                pUseLu(0);        //归还Lu的使用权
        }
        theFreeMLu();                //释放MLu
}结果:3
请按任意键继续. . .
页: [1]
查看完整版本: C/C++调用MLu的入门程序