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[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].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[i].BType=luStaData_int64; pPara[i].VType=luStaData_int64; pPara[i].x=1;
}
Val=pLuCal(hFor,pPara); //計算表達式的值
cout<<Val.x<<endl;
}
else
{
cout<<"找不到指定的函數!"<<endl;
}
}
pUseLu(0); //歸還Lu的使用權
}
theFreeMLu(); //釋放MLu
}
結果:
3
請按任意鍵繼續.
摘自 forcal的專欄