收藏 分享(赏)

在CC++中使用Lu脚本步骤图示.doc

上传人:涵涵文库 文档编号:5532504 上传时间:2019-03-06 格式:DOC 页数:27 大小:1.77MB
下载 相关 举报
在CC++中使用Lu脚本步骤图示.doc_第1页
第1页 / 共27页
在CC++中使用Lu脚本步骤图示.doc_第2页
第2页 / 共27页
在CC++中使用Lu脚本步骤图示.doc_第3页
第3页 / 共27页
在CC++中使用Lu脚本步骤图示.doc_第4页
第4页 / 共27页
在CC++中使用Lu脚本步骤图示.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

1、在 Win32 SDK 中使用 Lu 模块化编译运行库 MLu(Windows XP 系统,使用 VC 2008 演示)(欢迎访问:http:/ )1、启动 VS 2008(VC+ 2008) ,点击红色圈出部分创建项目。2、创建 Win32 项目,名称为 TestMLu,点击“确定” 。3、点击“下一步” 。4、选择“空项目” ,点击“完成” 。5、工程生成后如下图所示。6、在进行下一步之前,先来看看我们要设计的主程序界面,我们将先实现这个界面。7、实现主程序界面的代码:这些代码没有使用 Lu,仅仅实现主程序界面头文件:TestMLu.h(文件创建方法:先创建一个文本文件,输入以下内容并保存

2、,然后更改文件名为 TestMLu.h)#define IDM_cal_com 10#define IDM_cal_cal 11#define IDM_cal_comcal 12#define IDE_EditCode 30#define IDE_EditOut 31(注意:复制到文件中后,最后一条语句后面,请加一个回车,否则容易出现编译错误。下同。 )资源文件:TestMLu.rc(文件创建方法:先创建一个文本文件,输入以下内容并保存,然后更改文件名为 TestMLu. rc)#include “windows.h“#include “TestMLu.h“/ MenumainMenu MEN

3、U DISCARDABLE POPUP “计算 ( /实例句柄HWND hwndEditCode,hwndEditOut; /代码窗口和输出窗口LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); /窗口函数说明/ Windows 应用程序入口int WINAPI WinMain(HINSTANCE hhInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)HWND hWnd;MSG Msg ;WNDCLASS wndclass ;wchar_t lpszClassName=L“c

4、lassTestMLu“;/窗口类名wchar_t lpszTitle= L“TestMLu“; /窗口标题名hInstance=hhInstance; /记住实例句柄/窗口类的定义wndclass.style = 0; /窗口类型wndclass.lpfnWndProc = WndProc ; /窗口处理函数为 WndProcwndclass.cbClsExtra = 0 ; /窗口类无扩展wndclass.cbWndExtra = 0 ; /窗口实例无扩展wndclass.hInstance = hInstance ; /当前实例句柄wndclass.hIcon = LoadIcon( N

5、ULL, IDI_APPLICATION) ;/窗口的最小化图标为缺省图标wndclass.hCursor = LoadCursor( NULL, IDC_ARROW) ;/窗口采用箭头光标wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH) ;/窗口背景为白色wndclass.lpszMenuName = L“mainMenu“ ; /窗口菜单wndclass.lpszClassName = lpszClassName ;/窗口类名/窗口类注册if( !RegisterClass( MessageBox(GetFocus(

6、),L“注册失败!“,L“TestMLu“,MB_OK);return 0;/创建窗口hWnd=CreateWindow(lpszClassName, /窗口类名lpszTitle, /窗口实例的标题名WS_OVERLAPPEDWINDOW,/窗口的风格CW_USEDEFAULT,CW_USEDEFAULT, /窗口左上角坐标为缺省值CW_USEDEFAULT,CW_USEDEFAULT, /窗口的高和宽为缺省值NULL, /此窗口无父窗口NULL, /此窗口无主菜单hInstance, /创建此窗口的应用程序的当前句柄NULL) ; /不使用该值/显示窗口ShowWindow( hWnd,

7、SW_SHOWNORMAL) ;/绘制用户区UpdateWindow(hWnd);/消息循环 while( GetMessage(DispatchMessage( if(!UnregisterClass(lpszClassName,hInstance)/ Are We Able To Unregister ClassMessageBox(NULL,L“Could Not Unregister Class.“,L“TestMLu“,MB_OK | MB_ICONINFORMATION);return Msg.wParam; /消息循环结束即程序终止时将信息返回系统/窗口函数LRESULT CAL

8、LBACK WndProc(HWND hWnd,UINT Message,WPARAM wParam, LPARAM lParam)switch(Message)case WM_CREATE:hwndEditCode=CreateWindow(L“EDIT“,NULL, /创建代码编辑框;WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|WS_BORDER|ES_LEFT|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL,0,0,LOWORD(lParam),HIWORD(lParam/2),hWnd,(HMENU)IDE_

9、EditCode,hInstance,NULL);hwndEditOut=CreateWindow(L“EDIT“,NULL, /创建输出编辑框;WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|WS_BORDER|ES_LEFT|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL,0,HIWORD(lParam/2+2),LOWORD(lParam),HIWORD(lParam/2-2),hWnd,(HMENU)IDE_EditOut,hInstance,NULL);SetWindowText(hwndEditCode,L“

10、/这里是代码窗口,请将 Lu 代码写在下面rn“);SetFocus(hwndEditCode);break;case WM_SIZE:MoveWindow(hwndEditCode,0,0,LOWORD(lParam),HIWORD(lParam/2),true);MoveWindow(hwndEditOut,0,HIWORD(lParam/2+2),LOWORD(lParam),HIWORD(lParam/2),true);UpdateWindow(hWnd);break;case WM_COMMAND:switch(LOWORD(wParam)case IDM_cal_com:break

11、;case IDM_cal_cal:break;case IDM_cal_comcal:break;break;case WM_DESTROY:PostQuitMessage(0); /调用 PostQuitMessage 发出 WM_QUIT 消息break;default: /默认时采用系统消息默认处理函数return DefWindowProc(hWnd,Message,wParam,lParam);return 0;8、将 TestMLu.h、TestMLu.rc 和 TestMLu.cpp 三个文件放到文件夹“D:lulu32TestMLuTestMLu”。9、返回 VC,点击下图中

12、红色圈出部分“项目-添加现有项” 。10、添加 TestMLu.h、TestMLu.rc 和 TestMLu.cpp 三个文件到工程中。11、新的工程如下图,点击下图中红色圈出部分“生成-生成解决方案” 。12、生成 成功。13、点击下图中红色圈出部分“调试-开始执行(不调试) ”。14、程序界面如下图所示,与我们设想一致。15、在“TestMLu.cpp”中加入 Lu 脚本支持的代码,注意 红色和青色部分是新加的。/*使用 MLu 的一般步骤:(1)使用函数 InitMLu 进行初始化(必须) 。(2)使用函数 LoadDll 加载需要的 Lu 扩展库。(3)使用函数 ComModule 将

13、字符串源代码编译为模块(必须) 。(4)使用函数 ExeModule 执行模块,或者使用函数 GetFor 获取需要的表达式进行计算(必须) 。(5)使用函数 SearchKey 验证操作数据的类型,然后进行数据传送操作。 (本例未使用)(6)使用函数 FreeDll 卸载 Lu 扩展库。(7)使用函数 FreeMLu 释放资源(必须) 。*/#include “windows.h“#include “TestMLu.h“/使用 Lu 脚本必须的头文件#include “lu32.h“/隐式加载 MLu 时,需要使用的导入库文件#pragma comment( lib, “lu32.lib“

14、)#pragma comment( lib, “mlu32.lib“ )/ 全局数据HINSTANCE hInstance; /实例句柄HWND hwndEditCode,hwndEditOut; /代码窗口和输出窗口LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); /窗口函数说明/友情提示:所有定义的变量和函数,可通过编辑器提供的查找功能查看它在哪里使用/要加载的 Lu 扩展动态库wchar_t AllDllName=L“dllLuSystem32.dll“,“dllLuMath32.dll“,“dllLuOpt32.dll:1384136

15、99“,“dllLuIMSL32.dll:dllIMSL32.dll“,“dllLu2D32.dll“,“dllLuWin32.dll“,“dllOpenLuGl32.dll“;luVOID nModule=0; /编译模块时所用的起始模块号,一般设为 0void *hModule=NULL; /模块句柄,记住当前编译的模块。本例中,在编译时将销毁以前编译的模块/ MLu 使用的函数/输出动态库信息,该函数注册到 Lu,由 Lu 二级函数调用,输出必要的信息void _stdcall LuMessage(wchar_t *pch)int nTextLength;if(!pch) return;

16、nTextLength=GetWindowTextLength(hwndEditOut);SendMessage(hwndEditOut,EM_SETSEL,nTextLength,-1);SendMessage(hwndEditOut,EM_REPLACESEL,1,(LPARAM)pch);/执行 Lu 源程序时,仅对无参表达式做计算,以下函数用于输出表达式的结果void _stdcall OutLuData(LuData *LD)wchar_t wchNum32,*pStr;char chNum32;int i;luVOID k=0;luMessage pMessage; /输出动态库信

17、息的函数,例如本例中定义的 LuMessage 即是这样的函数/获取注册到 Lu 系统的输出动态库信息的函数,通常即本例中定义的 LuMessage 函数,但也不一定pMessage=(luMessage)SearchKey(char *)if(!pMessage) return;switch(LD-VType)case luStaData_nil:pMessage(L“nil“);break;case luStaData_int64:_i64tow_s(LD-x,wchNum,22,10);pMessage(wchNum);break;case luStaData_double:_gcvt_

18、s(chNum,*(double *)for(i=0;chNumi;i+) wchNumi=chNumi;wchNumi=0;pMessage(wchNum);break;case luStaData_complex:pMessage(L“(“);_gcvt_s(chNum,*(double *)for(i=0;chNumi;i+) wchNumi=chNumi;wchNumi=0;pMessage(wchNum); pMessage(L“,“);_gcvt_s(chNum,*(double *)for(i=0;chNumi;i+) wchNumi=chNumi;wchNumi=0;pMess

19、age(wchNum); pMessage(L“)“);break;case luStaData_vector:pMessage(L“(“);_gcvt_s(chNum,*(double *)for(i=0;chNumi;i+) wchNumi=chNumi;wchNumi=0;pMessage(wchNum); pMessage(L“,“);_gcvt_s(chNum,*(double *)for(i=0;chNumi;i+) wchNumi=chNumi;wchNumi=0;pMessage(wchNum); pMessage(L“,“);_gcvt_s(chNum,*(double *)

20、for(i=0;chNumi;i+) wchNumi=chNumi;wchNumi=0;pMessage(wchNum); pMessage(L“)“);break;case luStaData_logical:if(LD-x)pMessage(L“true“);elsepMessage(L“false“);break;case luStaData_string:case luDynData_string:pStr=GetStr(LD,NULL,k);if(pStr) pMessage(pStr);break;default:pMessage(L“rn 不可识别类型! rn“);pMessag

21、e(L“rn“);bool LoadMLu(void) /加载 MLuif(!InitMLu() return false;LoadDll(AllDllName);/加载 Lu 扩展动态库return true;void comcode(void) /将 Lu 源代码编译为模块wchar_t *pstr=NULL;int nCode,nTextLength,k;luINT err1,err2;int ErrType; /运行错误类型wchar_t *FunName; /出错函数名void *ForHandle; /运行出错的表达式句柄luVOID m=0;wchar_t *ppErrStrS=

22、L“rn 编译错误:递归调用指定的模块。rn“,/-7L“rn 编译错误:找不到指定的模块。rn“,/-6L“rn 编译错误:缺少模块名。rn“,/-5L“rn 编译错误:注释符号/* . */不成对。rn“,/-4L“rn 编译错误:未使用模块编译功能,不能编译指定的模块。rn“,/-3L“rn 编译错误:无法加锁模块。rn“,/-2L“rn 编译错误:未用。rn“,/-1L“rn 编译错误:编译成功。rn“,/000000000000L“rn 编译错误:内存分配失败。rn“,/1L“rn 编译错误:括号不成对。rn“,/2L“rn 编译错误:(等号后)没有表达式。rn“,/3L“rn 编译

23、错误:非法的函数句柄。rn“,/4L“rn 编译错误:字符串中转义字符错误。rn“,/5L“rn 编译错误:字符串无效,即“.“不匹配。rn“,/6L“rn 编译错误:不可识别字符。rn“,/7L“rn 编译错误:表达式名称定义错误。rn“,/8L“rn 编译错误:不可识别的自变量,自变量只能以字母或下画线开头。rn“,/9L“rn 编译错误:不可识别的自变量定义方法, “(,:,:,:,:,.)”冒号过多。rn“,/10L“rn 编译错误:自变量定义错误。rn“,/11L“rn 编译错误:continue()函数只能有 0 个参数。rn“,/12L“rn 编译错误:只能在 while,unt

24、il 中使用 continue 函数。rn“,/13L“rn 编译错误:break()函数只能有 0 个参数。rn“,/14L“rn 编译错误:只能在 while,until 中使用 break 函数。 rn“,/15L“rn 编译错误:if,while,until,which 中的参数个数至少为 2 个。rn“,/16L“rn 编译错误:表达式中的数字错误。rn“,L“rn 编译错误:nTextLength=GetWindowTextLength(hwndEditCode)+1;pstr=new wchar_tnTextLength;if(!pstr) return;GetWindowTex

25、t(hwndEditCode,pstr,nTextLength);k=UseLu(2); /申请进入 Lu 工作区,保证了多线程程序中,互斥使用 Lu 系统if(!k) /进入 Lu 工作区DelModule(hModule); /销毁以前编译的模块GetRunErr(ErrType,FunName,nCode,ForHandle); /设置运行错误为无错状态/注册 LuMessage 函数到 Lu 系统,使 Lu 运行时可输出函数信息/其他 Lu 扩展库也可注册类似的函数到 Lu 系统,故每次编译前都进行注册InsertKey(char *)nCode=ComModule(pstr,nMod

26、ule,hModule,err1,err2); /编译模块UseLu(0); /离开 Lu 工作区if(nCode) /有编译错误hModule=NULL;nTextLength=GetWindowTextLength(hwndEditOut);SendMessage(hwndEditOut,EM_SETSEL,nTextLength,-1);if(nCode=-7&nCode=0&err1=0&err2生成解决方案” 。19、重新运行程序,弹出几个“MLu:加载动态库失败”的窗口。20、运行一段代码,OK!21、打开文件夹 D:lulu32TestMLuDebug22、双击运行“TestML

27、u.exe” 。23、将“lu32.dll”和“MLu32.dll”复制到该文件夹。24、再双击运行“TestMLu.exe” ,和前面一样,弹出几个“MLu:加载动态库失败”的窗口,但可以运行 Lu 程序。Lu 程序及运行结果:25、从软件包 http:/ 中找到文件夹“dll ”,该文件夹中包含了若干 Lu 扩展动态库,将整个文件夹复制到这里。26、再次双击运行“TestMLu.exe” ,程序顺利启动。27、运行一段 OpenLuGl 代码。28、下载工程 TestMLu(不包含文件夹“dll” ):http:/ 。29、如果希望得到一个语法高亮的编辑器,可下载(不包含文件夹“dll ”):http:/ 。RICHEDTestMLu 是在 SDKTestMLu 的基础上生成的,使用了 Richedit 控件。比较一下 RICHEDTestMLu 和 SDKTestMLu 中的 TestMLu.cpp 文件,可以了解做了哪些更改。注意 RICHEDTestMLu 中添加了三个语法高亮的关键字 while、if、new ,你可以修改代码以增加更多的语法高亮关键字。由于 RICHEDTestMLu 中的 TestMLu.cpp 文件较长,故本文未提供,可在 TestMLu.cpp中查找字符串 Richedit 了解新增的代码部分。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报