ImageVerifierCode 换一换
格式:DOC , 页数:27 ,大小:1.77MB ,
资源ID:5532504      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-5532504.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(在CC++中使用Lu脚本步骤图示.doc)为本站会员(涵涵文库)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

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

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营业执照举报