程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C/C++調用MLu的入門程序

C/C++調用MLu的入門程序

編輯:C++入門知識

 

  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的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved