Windows通信机制和DLL机制实验报告_第1页
Windows通信机制和DLL机制实验报告_第2页
Windows通信机制和DLL机制实验报告_第3页
Windows通信机制和DLL机制实验报告_第4页
Windows通信机制和DLL机制实验报告_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精品 课程设计报告课 程 名 称: 基于Windows的课程设计 题 目: 应用程序与DLL 年级/专业/班: 计算机09-3班 学 生 姓 名: 学 号: 一 设计要求<1>编写一个Windows应用程序产生一个窗口,该窗口能够对窗口上的消息进行响应。即当 鼠标单击相应区域或者菜单后,程序会调用你的dll函数给出结果。<2>编写一个DLL,至少包含两个以上的接口函数供上述应用程序调用<3>使用C+Win32函数,而不是MFC框架,体会windows消息机制。所有的代码自己完成二 目的<1>Windows消息循环机制<2>DLL机制课

2、本中OS消息传递机制Windows窗口消息循环机制,DLL机制课本中内存管理机制Windows DLL机制在进程地址空间中的位置三 背景知识3.1 Windows 应用程序3.1.1 WinMain入口点 函数功能:该函数被系统调用,作为一个32位应用程序的入口点。函数原型:int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);参数;<1>hInstance:应用程序当前事例的句柄。<2>hPrevlnstance:应用程序的先事例的

3、句柄。对于同一个程序打开两次,出现两个窗口第一次打开的窗口就是先前实例的窗口。对于一个32的位程序,该参数总为NULL。 如果需要检测另外一个事例是否已经存在,则使用CreateMutex函数创建一个独一无二的名字。即使互斥名已经存在,CreateMutex函数也是成功的,但是GetLastError函数将返回 ERROR_ALREADY_EXISTS,这就表明在应用程序中有另外一个事例存在,因为它首先创建了互斥名。<3>lpCmdLine:指向应用程序命令行的空字符串的指针,不包括函数名。获得整个命令行,参看GetCommandLine <4>nCmdShow:指明窗

4、口如何显示。该参数可以是下列值之一:SW_HIOE:隐藏窗口并且激活另外一个窗口。SW_MINIMIZE:最小化指定的窗口,并且激活在系统表中的顶层窗口。SW_RESTORE:激活并显示窗口。如果窗口已经最小化或最大化,系统将以恢复到原来的尺寸和位置显示窗口(与SW_SHOWNORMAL相同)。SW_SHOW:激活一个窗口并以原来的尺寸和位置显示窗口。SW_SHOWMAXIMIZED:激活窗口并且将其最大化。SW_SHOWMINIMIZED:激活窗口并将其目标化。SW_SHOWMINNOACTIVE:将一个窗口显示为图标。激活窗口维持活动状态。SW_SHOWNA:以窗口的当前状态显示窗口。激活

5、窗口保持活动状态。SW_SHOWNOACTIVATE:以窗口的最近一次的尺寸和位置显示窗口。激活窗口维持激活状态。SW_SHOWNORMAL:激活并显示窗口。如果窗口最大化或最小化,系统将其恢复到原来的尺寸和位置(与SW_RESTORE相同)。<5> 返回值:如果函数成功,当它接收到一个WM_QUIT消息时就中止,函数应该返回在该消息的wParam参数的退出值。如果函数在进入消息循环时退出,应该返回零。3.1.2 窗口类的注册与创建3.1.2.1 窗口类的注册一个应用程序在创建某个类型的窗口前,必须首先注册该“窗口类”(Windows Class)。 “窗口类”是Windows系统

6、的数据结构,可以把它理解为Windows系统的类型定义,而Windows窗口则是相应“窗口类”的实例。Windows使用一个结构来描述“窗口类”,其定义如下: typedef struct _WNDCLASSEX UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HANDLE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; HICON hIconSm

7、; WNDCLASSEX; 其中style 是窗口样式,通过系统预先定义的一些常量来设置窗口样子,这些常量包CS_BYTEALIGNCLIENT(表示窗口客户区以 byte 的宽度对齐)、CS_DBLCLKS(如果有双击会向窗口发送消息)、CS_NOCLOSE(无关闭按钮)等。 lpfnWndProc 是消息处理函数。 hInstance 应该赋值为应用程序的实例。 hIcon,hCursor,hbrBackground,lpszMenuName 分别为窗口类的图标、鼠标指针的样式、背景的画刷(COLOR_ BACKGROUND、COLOR_WINDOW 等,也可以自行建立画刷)、菜单名。 可

8、以从资源获取图标、鼠标指针的样式和菜单。 应用程序在创建自己的窗口时,首先必须注册自己的窗口类。 窗口类的注册虽然只需填充一个结构体,调用一个 API 函数,但是窗口注册结构 WNDCLASSEX或 WNDCLASS结构的设置较复杂,需注意设置的正确性。3.1.2.2 窗口类的创建WinMain 函数调用的 InitInstance 函数实现了程序主窗口的创建。CreateWindow CreateWindowEx 是用于创建窗口的 API 函数。 CreateWindow 函数 CreateWindow 函数的功能是创建一个窗口。在创建窗口前,需先注册窗口类。如果创建的窗口是系统控件,那么系

9、统控制的类已经由操作系统注册好,所以不再需要注册。 创建窗口时,通过窗口指定窗口名、窗口样式、窗口的大小和位置、窗口所属的父窗口等。 HWND CreateWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HANDLE hlnstance, LPVOID lpParam ); <1>参数lpClassName 是窗口所需窗口类的类名。 <2>参数lpWi

10、ndowName 是窗口名,如果窗口有标题栏,窗口名将显示在标题栏上。 <3>参数dwStyle是窗口样式。窗口是否具有标题栏,是否可改变大小,边框的样式等都通过这个参数设置, <4>参数 x、y 指定了窗口创建后的初始位置,编程时可以设置为 CW_USEDEFAULT,由 系统 来设置。 <5>参数nWidth、nHeight,表示窗口的宽和高,以像素点为单位,同样也可以指定为 CW_USEDEFAULT,使用系统默认。 <6>参数hMenu 是窗口菜单的句柄,如果设置为 NULL,表示使用窗口类的菜单。 hWndParent 是窗口的父窗口句

11、柄,当窗口样式有 WS_CHILD 时需设备父窗口句柄。 <7>参数hInstance 是应用程序实例,设置为 WinMain 函数参数 hInstance。 lpParam指定相关参数,指向 CREATESTRUCT 结构的变量,可以为 NULL。 3.1.3 窗口处理函数Windows 系统是消息(Message)驱动的。消息在 Windows 处理用户交互的过程中具有重要作用。当用户操作输入设备,产生硬件中断后,系统内核会得到这此硬件中断,硬件在系统中经过复杂的运算和处理最终变成消息。消息被系统发送给指定窗口。 所有的对用户界面的操作都会产生消息,包括鼠标单击、按钮、菜单选择

12、、窗口创建窗口移动等。Windows 消息种类很多。 在创建窗口时,需指定窗口所属的窗口类,前面提到,每一个窗口类都对应一个消息处理函数,因此每一个窗口都具有自己的消息处理函数。程序员在开发窗口应用程序时,需编写窗口消息处理函数。消息处理函数是一个回调( Call Back)函数。此函数并不是由应用程序调用,而是由系统调用的。应用程序向系统注册了窗口类,创建了窗口,系统在消息产生后,需要窗口消息处理函数来处理时,调用窗口所对应的消息处理函数。 消息处理函数的功能一般是相应用户在窗口上的操作和输入。比如用户在菜单中选中了一个菜单项,那么就会产生一个消息。然后,窗口的消息处理函数就会被调用。消息处

13、理函数被调用后根据消息的类型和参数判断应该如何处理用户的输入,然后进行相关的处理。窗口处理函数 消息处理函数是一个回调函数,是注册窗口类时指定(通过函数指针赋值给 WNDCLASS 结构或 WNDCLASSEX 结构的 lpfnWndProc成员来指定消息处理函数),在有消息需要处理时由系统调用。 LRESULT CALLBACK WindowProc ( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM IParam ); hwnd:指向窗口的句柄。 uMsg:指定消息类型。 wParam:指定其余的、消息特定的信息。该参数的内容与UMsg参数值有关。

14、IParam:指定其余的、消息特定的信息。该参数的内容与uMsg参数值有关。 返回值:返回值就是消息处理结果,它与发送的消息有关。 回调函数的函数名任意,但是调用类型、返回值类型、参数类型和顺序必须固定,以使系统可以正常调用消息处理函数。窗口消息处理重要消息 (1) WM NOTIFY。 当一个窗口的子窗口被用户操作时,该子窗口会向父窗口发送 WM NOTIFY 通知(2) WMDESTROY。 收到WMDESTROY 消息,表示用户单击窗口的关闭按钮。如果用户单击主窗口的关闭按键,一般情况下表示用户需要结束本程序的运行。因此在 MainWndProc 函数收到WM_DESTROY 消息后,调

15、用 PostQuitMessage 函数退出程序运行。要退出一个进程的运行,也可以调用 ExitProcess函数。 (3) WM_COMMAND。 收到 WM_COMMAND -般是因为用户通过菜单、按钮等用程序输入命令。WM_COMMAND 消息的 wP aram的低位 WORD是表示用户单击的控件或菜单项的 ID3.2 DLL如图在VC+中 新建一个Win32 Dynamic - Link Library 工程DLL简介:动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供

16、了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。导出 DLL 函数方法一、向导出的 DLL 函数中添加函数关键字 要使用函数关键字,您必须使用以下关键字来声明要导出的各个函数: _declspec(dllexport) 要在应用程序中使用导出的 DLL 函数,您必须使用以下关键字来声明要导入的各个函数: _declspec(dllimport

17、) 通常下,您最好使用一个包含 define 语句和 ifdef 语句的头文件,以便分隔导出语句和导入语句。 方法二、创建模块定义文件 (.def) 以列出导出的 DLL 函数 使用模块定义文件来声明 导出的 DLL 函数。当您使用模块定义文件时,您不必向导出的 DLL 函数中添加函数关键字。在模块定义文件中,您可以声明 DLL 的 LIBRARY 语句和 EXPORTS 语句。DLL应用原理首先,语句typedef int (* lpAddFun)(int ,int)定义了一个与add函数接收参数类型和返回值 均相同的函数指针类型。随后,在main 函数中定义了lpAddFun的实例addF

18、un;其次,在函数main 中定义了一个DLL HINSTANCE 句柄实例hDll,通过Win32 API 函数 LoadLibrary 动态加载了DLL 模块并将DLL 模块句柄赋给了hDll ;在次,在函数main中Win32API 函数GetprocAddress得到了所加载DLL模块中add的地址 并付给了addFun.经由函数指针addFun进行了对DLL中add函数的调用。最后,应用工程使用完DLL后,在函数main中通过Win32API 函数FreeLibrary释放已经 加载的DLL模块。四 源码<1>DLL部分#include<windows.h>#

19、include<math.h>#ifndef LIB_H#define LIB_Hextern "C" void _declspec(dllexport)setCalculate(HWND hwnd,HWND hwnd1,HWND hwnd2,HWND hwnd3,HWND hwnd4);extern "C" void _declspec(dllexport)setClearAll(HWND hwnd1,HWND hwnd2,HWND hwnd3,HWND hwnd4);#endif#include"event.h"cha

20、r Money = ""char Rate = ""char Year = ""char Total = ""/*+ + + *主函数:Check + + *功能: 输入判断函数 + *参数: a 输入的字符串 + *返回值:全是数字返回TRUE 否则返回FALSE + + + +*/BOOL Check(char a) int i;int len = strlen(a);for(i=0;i<len;i+)if(ai>'9'|ai<'0')return FALSE;

21、return TRUE;/*+ + *主函数:setCalculate + + *功能: 为CalculateButton添加响应 + 输入本金,利率,年 输出总钱数 + *参数: hwnd 父窗口句柄 + hwnd1 本金输入框句柄 +hwnd2 利率输入框句柄 +hwnd3 年数输入框句柄 + +hwnd4 输出框句柄 + *返回值: + +*/void setCalculate(HWND hwnd,HWND hwnd1,HWND hwnd2,HWND hwnd3,HWND hwnd4)GetWindowText(hwnd1,Money,20); GetWindowText(hwnd2,R

22、ate,20);GetWindowText(hwnd3,Year,20); double totalMoney;if(Check(Money)&&Check(Rate)&&Check(Year)totalMoney = atof(Money)*pow(1/atof(Rate)+1,atoi(Year);gcvt(totalMoney,10,Total);SetWindowText(hwnd4,Total);elseMessageBox(hwnd,TEXT("对不起,你输入的格式不对"),TEXT("提示"),MB_OK);

23、SetWindowText(hwnd1,"");SetWindowText(hwnd2,"");SetWindowText(hwnd3,"");SetWindowText(hwnd4,"");/*+ + *主函数:setClearAll + + *功能: 为ClearButton添加响应 + 清空所有输入框输出框 + *参数: hwnd1 本金输入框句柄 +hwnd2 利率输入框句柄 +hwnd3 年数输入框句柄 + +hwnd4 输出框句柄 + *返回值: + +*/void setClearAll(HWND h

24、wnd1,HWND hwnd2,HWND hwnd3,HWND hwnd4)SetWindowText(hwnd1,"");SetWindowText(hwnd2,"");SetWindowText(hwnd3,"");SetWindowText(hwnd4,"");<2>窗口部分/windows程序的头文件#include<windows.h>extern char szTitle; /标题条字符串extern char szWindowClass; /窗口类名extern char sz

25、MenuName ; extern int ID,ID_1;/函数原型声明ATOM InitApplication(HINSTANCE); /用来注册窗口类BOOL InitInstance(HINSTANCE , int); /用来创建主窗口LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM); /消息处理函数int APIENTRY WinMain( HINSTANCE , HINSTANCE , LPSTR , int); /主函数BOOL CreateControl(HINSTANCE,HWND, LPSTR); /创建文本框 #i

26、nclude "window.h"#include<math.h>/全局变量char szTitle = "Windows通信机制和DLL机制" /标题条字符串Char szWindowClass = "w32" /窗口类名Char szMenuName ="NULL" /菜单名typedef void (*lpsetCalculateFun)(HWND ,HWND ,HWND ,HWND ,HWND);typedef void (*lpsetClearAllFun)(HWND ,HWND ,HWND

27、,HWND);HWND hwnd1,hwnd2,hwnd3,hwnd4,calculateButton,clearButton;HWND hwnd; /*+ + *主函数 WinMain + *功能: 初始化及注册窗口类,创建窗口,进入消息循环及终止应用程序 + *参数: hInstance 当前实例 + hPrevInstance 前一个实例 + + lpCmdLine 命令行 + + nCmdShow 选择显示窗口或图标 + *返回值:msg.wParam +*/int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstanc

28、e , LPSTR lpCmdLine , int nCmdShow )MSG msg; /声明消息结构对象InitApplication( hInstance ); /注册窗口if( !InitInstance( hInstance, nCmdShow ) ) /初始化return FALSE;while ( GetMessage(&msg, (HWND) NULL, 0, 0) ) /消息循环TranslateMessage(&msg); /检索消息 DispatchMessage(&msg); /将消息间接传给函数指针return msg.wParam; /结束消

29、息循环传回PostQuitMesage /*+ + *主函数:InitApplication + + *功能: 用来注册窗口类 + *参数: hInstance 当前实例 + *返回值:如果成功,返回一个唯一的整数,如果失败,返回0 + + */ATOM InitApplication(HINSTANCE hInstance)WNDCLASS wc; /声明窗口结构对象/初始化对象的域值wc.style = CS_HREDRAWCS_VREDRAW; / 如果大小改变了重绘窗口 wc.lpfnWndProc = WndProc; /窗口消息处理函数wc.cbClsExtra = 0; / 无附

30、加窗口类内存 wc.cbWndExtra = 0; / 无附加窗口内存wc.hInstance = hInstance; /当前实例wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); / 图标wc.hCursor = LoadCursor(NULL, IDC_ARROW); / 鼠标指针wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); / 背景画刷wc.lpszClassName = szWindowClass; / 窗口类名wc.lpszMenuName = szMenuName; /菜单名Retu

31、rn RegisterClass(&wc); /注册/*+ + *主函数:InitInstance + + *功能: 用来创建主窗口 + *参数: hInstance 当前实例 + nCmdShow 选择显示窗口或图标 + *返回值:如果成功,返回一个非零值,如果失败,返回0 + +*/BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) /声明窗口句柄hwnd = CreateWindow(szWindowClass, / 窗口类名,使用之前注册的主窗口类szTitle, / 窗口名,显示在窗口标题栏上的字符串WS_OVERLAPP

32、EDWINDOW |WS_VSCROLL|WS_HSCROLL, /显示方式 具有水平和垂直滚动CW_USEDEFAULT, / x起点坐标CW_USEDEFAULT, / y起点坐标400, / 宽300, / 高NULL, / 无父窗口NULL, / 菜单句柄hInstance, /实例句柄NULL / 无窗口创建数据);if(!hwnd) / 判断是否创建成功return FALSE; CreateControl( hInstance, hwnd, NULL);ShowWindow(hwnd, nCmdShow); /创建成功便显示窗口UpdateWindow(hwnd); /送出WM_

33、PAINT消息return TRUE;/*+ + *主函数:CreateControl + + *功能: 创建文本框 + *参数: hwndp 父窗口句柄 + szTitle 窗口标题 + *返回值: + +*/BOOL CreateControl(HINSTANCE hInstance, HWND hwndp, LPSTR szTitle)hwnd1=CreateWindow("edit",NULL,WS_CHILD|WS_VISIBLE|WS_BORDER, 50, 40,100, 20, hwndp, NULL,hInstance, NULL);calculateBu

34、tton = CreateWindow( "BUTTON","计算", WS_CHILD |WS_VISIBLE|WS_BORDER, 180, 40,60, 20, hwndp, NULL,hInstance, NULL);clearButton = CreateWindow( "BUTTON","清除", WS_CHILD |WS_VISIBLE|WS_BORDER, 180, 70,60, 20, hwndp, NULL,hInstance, NULL); hwnd2 = CreateWindow( "edit",NULL, WS_CHILD |WS_VISIBLE|WS_BORDER, 50, 70,100, 20, hwndp, NULL,hInstance, NULL);hwnd3 = CreateWindow( "edit",NULL, WS_CHILD |WS_VISIBLE|WS_BORDER, 50, 100,100, 20, hwndp, NULL,hInstance, NULL); hwnd4 = CreateWindow( &q

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论