




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
设计1 Windows应用程序与动态链接库一、设计目的1、通过编写一个Windows窗口应用程序,了解Windows编程的基本方法,理解Windows操作系统的消息通信机制;2、通过编写一个动态链接库,体会程序执行时的动态链接过程,掌握DLL的基本原理及其导入与导出。二、设计要求(1)编写一个Windows应用程序,要求产生一个简单的窗口。在该窗口的菜单栏中有一个Menu菜单,其中包含三个菜单项:Menu1,Menu2和Exit.单击菜单项Menu1,在菜单的客户区显示“Hwllo from menu1!”;单击菜单Menu2,在窗口的客户区显示“Hello from menu2!”;单击Exit,退出程序。(2)编写一个Dll,其中含有两个函数Func1和Func2可供应用程序调用,这两个函数的功能均为返回一个字符串。Func1返回的字符串是“Hello from Func1,this function was called from .”其中“.”为调用该函数的应用程序的名称与路径.Func2返回的字符串与此相同。(3)修改第一项创建的应用程序,使得当单击菜单项Menu1时调用第2项创建的Dll中的Func1,获得Func1返回的字符串,并将其显示在窗口的客户区中。单击菜单项Menu2时调用Func2,并完成类似的操作。(4)要求使用C编程,不允许使用MFC,以便体会Windows应用程序的消息机制。要求创建新工程时使用empty project,程序中的所有代码均由自己完成(包括窗口和菜单的创建),不用VC+自动生成代码三、设计说明3.1具体设计 (1)对应于三个要求有三个工程:相应有三个文件夹:app,dll,app_dll。下面分别加以说明。对于第一个程序app1,这个程序就是输出一个字符串来说明单击了哪个选项。示例程序没有写resource文件,在建立win32工程的时候选择了empty工程,并把所有的代码写到了一个app1.cpp文件里。并把添加菜单的工作用函数实现了,所以没有直接去写resource文件。(2)dll文件夹下放了动态链接库程序,用来实现相应的函数功能。编译后生成dll文件dll.dll。dll_cpp文件夹下放了一个由app改动后的app_dll.cpp的源文件,并把dll文件夹下的头文件(dll.h)放在了这里,并建立了一个win32工程一起编译连接运行。(3)这里用的是隐式调用dll的方法,最简单的实现是把dll文件夹下的dll.dll放到app_dll的debug中,并把dll.lib文件引入。3.2流程图:(1)dll.h部分声明函数function1和function2为导出函数。形式如下:EXPORT PCSTR function1(HINSTANCE hinstance);EXPORT PCSTR function2(HINSTANCE hinstance);(2)dll.cpp部分分别实现导出函数function1和function2。其功能为返回字符串”Hello from Func1(2),this function was called from ”,其中”为调用该函数的应用程序的名称与路径。(1)主函数部分该主函数中只是引用了dll文件,通过#include “dll.h”来实现。其他与第一个程序中的一样。(2)子程序部分(消息处理函数部分)此处的消息处理函数的程序流程图与第一个程序中的消息处理函数的类似,只是实现显示字符串模块不同而已。后者直接实现显示字符串,而前者通过调用动态链接库中的导出函数实现。主函数模块,即WinMain函数部分。如下页图设定菜单ID设定消息处理函数,句柄,应用程序名应用程序入口给各变量赋值窗口注册成功 cheng成功建立菜单创建窗口成功返回错误信息开始消息为退出结束显示更新返回错误信息NYNYYNN接收消息处理消息变更显示结果结束四、运行结果及分析(1)实验结果:1编译运行后出现下面的窗体:依次点击Menu1和Menu2后出现的运行结果如下: 点击Exit后退出。2编译运行后出现如下所示的窗体: 依次点击窗体中的Menu1,Munu2后窗体变成如下所示:点击Exit后退出。五总结:1、第三个程序中需要将dll.h,dll.cpp和app_dll.cpp添加到一个工程中。2.窗口函数是一个回调函数,它由Windows调用,应用程序并不会直接调用它的窗口函数。3.CreateWindow并不能显示窗口,所以要利用ShowWindow将窗口显示在屏幕上。调用UpdateWindow传送一个WM_PAINT给窗口以驱动窗口的绘图操作。4、DLL就是一个可执行程序模块,模块中包含了可以被其他应用程序或其他DLL共享的程序代码和资源。5、DLL与C+类的区别在于,类是创建时的模块,而DLL是运行时的模块,链接是在程序运行时动态的进行的,连接时并没有将函数库中的函数链接到应用程序的可执行文件中。6、动态连接库的调用方法有两种:显示的和隐式的。7、使用DLL中的到处函数有两种方法。一种是直接将dll.h和dll.cpp与调用程序添加到一个工程里面。另一种方法是,将编译好的DLL项目中的.h文件、.lib文件以及.dll文件复制到用户程序路径下,并将.lib文件加入到用户程序项目中。附:主要源代码app1.cpp#include LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);/消息处理函数HINSTANCE hInst;/句柄LPCTSTR lpszAppName=MyApp;/应用程序名LPCTSTR lpszTitle=My Application;/标题int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR IpCmdLine,int nCmdShow)/应用程序入口 窗口变量赋值;hWnd=CreateWindow(lpszAppName,lpszTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,hMenu,hInstance,NULL);/创建窗口 if(!hWnd)/没有创建成功return FALSE;ShowWindow(hWnd,nCmdShow);/显示窗口UpdateWindow(hWnd);/更新窗口,传送一个WM-PAINT给窗以驱动窗口的绘图操作while(GetMessage(&msg,NULL,0,0)/传递消息TranslateMessage(&msg);/转换键盘消息DispatchMessage(&msg);/将消息传递给消息函数去处理 return (msg.wParam);LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)/PAINTSTRUCT ps;HDC hdc;static PCSTR outPut=1111;static PCSTR pString1=Hello from MENU1;/要显示的字符串static PCSTR pString2=Hello from MENU2;switch(uMsg)case WM_COMMAND:switch(LOWORD(wParam)/利用该语句队进入的消息进行过滤处理case IDM_MENU1:/显示MENU1的字符hdc=GetDC(hWnd);TextOut(hdc,30,100,pString1,strlen(pString1);ReleaseDC(hWnd,hdc);break; case IDM_MENU2:/显示MENU2的字符hdc=GetDC(hWnd);TextOut(hdc,80,200,pString2,strlen(pString2);ReleaseDC(hWnd,hdc);break; case IDM_EXIT:DestroyWindow(hWnd);break;break;case WM_DESTROY: PostQuitMessage(0);break;default:return (DefWindowProc(hWnd,uMsg,wParam,lParam);return(0L);dll.cpp#include#includedll.hPCSTR infor=;char lpszName101;int WINAPI DLLMain(HINSTANCE hInstance,DWORD fdwReason,PVOID pvReserved)switch(fdwReason)case DLL_PROCESS_ATTACH:break;case DLL_THREAD_ATTACH:break;case DLL_PROCESS_DETACH:break;return TRUE;EXPORT PCSTR function1(HINSTANCE hInstance)PCSTR ptr=this dll is called from function;strcpy(lpszName,ptr);int size=101-strlen(ptr);char * temp=&lpszNamestrlen(ptr);GetModuleFileName(hInstance,temp,size);infor=lpszName;return infor;EXPORT PCSTR function2(HINSTANCE hInstance)PCSTR ptr=this dll is called from function2;strcpy(lpszName,ptr);int size=101-strlen(ptr);char *temp=&lpszNamestrlen(ptr);GetModuleFileName(hInstance,temp,100);infor=lpszName;return infor;app.cpp#define IDM_MENU1 100#define IDM_MENU2 200#define IDM_EXIT 300#include #include dll.hLRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);HINSTANCE hInst;LPCTSTR lpszAppName=MyApp;LPCTSTR lpszTitle=My Application;int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR IpCmdLine,int nCmdShow) MSG msg;HWND hWnd;WNDCLASS wc;HMENU hMenu;wc.style = CS_HREDRAW|CS_VREDRAW;wc.lpfnWndProc =(WNDPROC)WndProc;wc.cbClsExtra =0;wc.cbWndExtra =0;wc.hInstance =hInstance;wc.hIcon =LoadIcon(NULL,(LPCTSTR)IDI_APPLICATION);wc.hCursor =LoadCursor(NULL,IDC_ARROW);wc.hbrBackground =(HBRUSH)(COLOR_WINDOW+1);wc.lpszMenuName =NULL;wc.lpszClassName =lpszAppName;if(!RegisterClass(&wc)return (FALSE);hInst=hInstance;hMenu=CreateMenu();AppendMenu(hMenu,MF_STRING,IDM_MENU1,MENU1);AppendMenu(hMenu,MF_STRING,IDM_MENU2,MENU2); AppendMenu(hMenu,MF_STRING,IDM_EXIT,EXIT);hWnd=CreateWindow(lpszAppName,lpszTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,hMenu,hInstance,NULL); if(!hWnd) return FALSE;ShowWindow(hWnd,nCmdShow);UpdateWindow(hWnd);while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg); return (msg.wParam);LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)HDC hdc;static PCSTR outPut=;switch(uMsg)case WM_COMMAND:switch(LOWORD(wParam)case IDM_MENU1:hdc=GetDC(hWnd);outPut=function1(hInst);TextOut(hdc,20,100,outPut,strlen(outPut);ValidateRect(hWnd,NULL);ReleaseDC(hWnd,hdc);break; case IDM_MENU2:hdc=GetDC(hWnd);outPut=function2(hInst);TextOut(hdc,20,200,outPut,strlen(outPut);ValidateRect(hWnd,NULL);break; case IDM_EXIT:DestroyWindow(hWnd);break;break;case WM_DESTROY: PostQuitMessage(0);break;default:return (DefWindowProc(hWnd,uMsg,wParam,lParam);return(0L); 函数介绍:CreateWindow 函数发布于:软件开发网 来源:互联网 作者:佚名 时间:2009-02-26 00:03 CreateWindowFunction CreateWindow函数创建一个交叠的、弹出的或者子窗口。它指定窗口类、窗口标题、窗口风格以及窗口初始化时的位置和大小(可选的)。它也指定了窗口的父窗口或者所有者,还可以指定窗口的菜单。要使用除了被CreateWindow支持的扩展的窗口风格,使用CreateWindowEx函数。 语法: HWND CreateWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam ); 参数: lpClassName 一个指向以零结尾的字符串的指针,或者指向以前由ReGISterClass或RegisterClassEx条用创建的原子的指针。这个原子必须是次参数的低位,高位必须是0。如果是一个字符串,它指定窗口类的名称。类名可以是用RegisterClass或RegisterClassEx注册过的任何名称,providedthatthemodulethatregisterstheclassisalsothemodulethatcreatesthewindow.类名称也可以是任何预定义的系统类名称。 lpWindowName 指向指定窗口名称的以零结尾的字符串的指针。如果窗口的风格指定了一个标题栏,则它将会显示在标题栏上。当使用CreateWindow创建控件时,此参数指定控件的文字。当用SS_ICON风格创建static控件时,此参数指定图标的名称或者标识符。要指定一个标识符,使用”#num”语法。 dwStyle 指定要创建窗口的风格。可以是窗口风格的组合,加上控件的风格的组合。 x 指定窗口的初始水平位置。对于overlapped或者弹出式窗口,x参数是初始的x坐标相当窗口的左上角,在屏幕坐标系上。Forachildwindow,xisthex-coordinateoftheupper-leftcornerofthewindowrelativetotheupper-leftcorneroftheparentwindowsclientarea.如果参数值被设置为CW_USEDEFAULT,系统为窗口左上角选择默认的位置并忽略y参数。CW_USEDEFAULT仅对overlapped窗口有效,如果它在弹出窗口或者自窗口上被指定,则x和y参数被设置为零。 y 指定窗口的初始化垂直位置。对于交叠式窗口或者弹出式窗口,y参数是在屏幕坐标上初始的窗口左上角的y坐标。对于子窗口,y是和父窗口客户区左上角相关的初始子窗口左上角的y坐标。对于listbox控件,y是和父窗口客户区左上角相关的listbox客户区初始的左上角的y坐标。如果用WS_VISIBLE风格创建一个overlapped窗口并且x参数设置为CW_USEDEFAULT,系统忽略y参数。nWidth 用设备单位指定窗口的宽度。对于overlapped窗口,nWidth参数既可以是在屏幕坐标上窗口的宽度,也可以是CW_USEDEFAULT.如果nWidth是CW_USEDEFAULT,系统选择一个默认的宽度和高度,这个默认的宽度从初始的x坐标到屏幕的右边缘,默认的高度从y坐标到图标区的顶端。CW_USEDEFAULT仅对overlapped窗口可用,如果对子窗口或者弹出窗口设置了
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论