Windows API学习之路一:程序入口、LPSTR与句柄
2016-07-28 15:02
281 查看
就像C/C++和JAVA有一系列的库函数一样,任何一种程序开发平台都会提供众多的接口函数供开发人员使用,Windows应用程序的开发核心问题是如何使用Windows SDK所提供的API。
API,即Application Program Interface。中文意思为“应用程序接口”,它是一系列函数、宏、数据类型、数据结构的集合。运行于Windows系统的应用程序可以使用这些操作系统提供接口来完成应用程序需要的功能。
对于一个应用程序来说,最重要的部分无疑就是程序的入口。与C/C++的mian函数类似,WinMain函数的入口程序是WinMain。其定义如下:
WinMain函数有4个参数: hInstance, hPrevInstance, lpCmdLine, nCmdShow。
第一个参数是hInstance,数据类型是HINSTANCE,此参数表示应用程序本次运行实例的句柄。
第二个参数是hPrevInstance,数据类型也是HINSTANCE,表示应用程序之前运行实例的句柄,但是在实际应用中,此参数始终未NULL。
第三个参数lpCmdLine,数据类型是LPSTR,L代表Long,P代表Pointer(指针),STR表示String。是运行时参数。举个例子说明,如在cmd命令行中运行“cmd.exe command”,那么lpCmdLine就指向字符串“command”,作用与C语言中main函数的参数作用类似。数据类型LPSTR是Windows API中常用的字符串类型。
最后一个参数是nCmdShow,数据类型是int,表示应用程序窗口的显示状态。WinMain函数的返回类型就是int型的。
Tips1: 详细介绍可参考MSDN给出的文档:WinMain entry point
Tips2: wWinMain是unicode版,WinMain是ANSI版。编码不同,如果程序中要有中文,就用wWinMain。建议用_tWinMain。它们都是程序的入口。
Tips3: 所谓句柄实际上是一个数据,是一个Long(整长型)的数据。句柄是windows用来标识被应用程序所建立或使用的对象的唯一整数,windows使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。指向指针的指针,Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需要记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。句柄地址(稳定)->记载着对象在内存中的地址->对象在内存中的地址(不稳定)->实际对象
麻雀虽小五脏居全,这短短的程序具备了所有的要素。
这行代码指明了包括Windows.h。它是应用程序开发中最常用的头文件,在Win应用程序开发中所使用的很多数据类型、结构、API接口函数都在Windows.h或其所包含的其他头文件中进行了声明,比如例子中所使用的MessageBox函数。如果没有这个头文件,编译器将不能识别MessageBox。可以说,开发Win程序的第一步就是加入Windows.h
这行代码指明将源文件编译生成目标文件(.obj)后,将目标文件链接成可执行文件的过程中需要使用到User32.lib,因为它包含了MessageBox的链接信息。如果中链接程序时,调用链接器的参数指明了链接时需要使用到user32.lib,这一句程序代码就可以忽略。
MessageBox的原型函数如下
第一个参数hWnd的数据类型是HWND,表示消息框所属的窗口的句柄,可以设置为NULL。
第二个参数lpText的数据类型是LPCTSTR,是字符串,表示消息框所显示的消息。
第三个参数lpCaption的数据类型也是LPCTSTR,表示消息框的标题
第四个参数uType的数据类型是UINT,表示消息框的类型,本例中设置为MB_OK,意思是消息框包含一个确定按钮。
函数最后返回0,表示结束WinMain函数,推出进程。
API,即Application Program Interface。中文意思为“应用程序接口”,它是一系列函数、宏、数据类型、数据结构的集合。运行于Windows系统的应用程序可以使用这些操作系统提供接口来完成应用程序需要的功能。
对于一个应用程序来说,最重要的部分无疑就是程序的入口。与C/C++的mian函数类似,WinMain函数的入口程序是WinMain。其定义如下:
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ /**/ return 0; }
WinMain函数有4个参数: hInstance, hPrevInstance, lpCmdLine, nCmdShow。
第一个参数是hInstance,数据类型是HINSTANCE,此参数表示应用程序本次运行实例的句柄。
第二个参数是hPrevInstance,数据类型也是HINSTANCE,表示应用程序之前运行实例的句柄,但是在实际应用中,此参数始终未NULL。
第三个参数lpCmdLine,数据类型是LPSTR,L代表Long,P代表Pointer(指针),STR表示String。是运行时参数。举个例子说明,如在cmd命令行中运行“cmd.exe command”,那么lpCmdLine就指向字符串“command”,作用与C语言中main函数的参数作用类似。数据类型LPSTR是Windows API中常用的字符串类型。
最后一个参数是nCmdShow,数据类型是int,表示应用程序窗口的显示状态。WinMain函数的返回类型就是int型的。
Tips1: 详细介绍可参考MSDN给出的文档:WinMain entry point
Tips2: wWinMain是unicode版,WinMain是ANSI版。编码不同,如果程序中要有中文,就用wWinMain。建议用_tWinMain。它们都是程序的入口。
Tips3: 所谓句柄实际上是一个数据,是一个Long(整长型)的数据。句柄是windows用来标识被应用程序所建立或使用的对象的唯一整数,windows使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。指向指针的指针,Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需要记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。句柄地址(稳定)->记载着对象在内存中的地址->对象在内存中的地址(不稳定)->实际对象
代码分析
这里给出一个简单的Windows应用程序的例子的代码:#include<Windows.h> #pragma comment(lib,"User32.lib") int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ MessageBox(NULL, TEXT("我要学习"), TEXT("消息对话框"), MB_OK); return 0; }
麻雀虽小五脏居全,这短短的程序具备了所有的要素。
#include<Windows.h>
这行代码指明了包括Windows.h。它是应用程序开发中最常用的头文件,在Win应用程序开发中所使用的很多数据类型、结构、API接口函数都在Windows.h或其所包含的其他头文件中进行了声明,比如例子中所使用的MessageBox函数。如果没有这个头文件,编译器将不能识别MessageBox。可以说,开发Win程序的第一步就是加入Windows.h
#pragma comment(lib,"User32.lib")
这行代码指明将源文件编译生成目标文件(.obj)后,将目标文件链接成可执行文件的过程中需要使用到User32.lib,因为它包含了MessageBox的链接信息。如果中链接程序时,调用链接器的参数指明了链接时需要使用到user32.lib,这一句程序代码就可以忽略。
MessageBox(NULL, TEXT("我要学习"), TEXT("消息对话框"),MB_OK);
MessageBox的原型函数如下
int WINAPI MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType );
第一个参数hWnd的数据类型是HWND,表示消息框所属的窗口的句柄,可以设置为NULL。
第二个参数lpText的数据类型是LPCTSTR,是字符串,表示消息框所显示的消息。
第三个参数lpCaption的数据类型也是LPCTSTR,表示消息框的标题
第四个参数uType的数据类型是UINT,表示消息框的类型,本例中设置为MB_OK,意思是消息框包含一个确定按钮。
函数最后返回0,表示结束WinMain函数,推出进程。
相关文章推荐
- 在函数中以数组作为形参的方法
- jQuery.extend 函数详解
- linux基础(8)-颜色显示
- 6、Java并发编程:volatile关键字解析
- 网络层、传输层、应用层、端口通信协议编程接口 - http,socket,tcp/ip 网络传输与通讯知识总结
- java中 关于运算符注意的事项
- 炫酷的circleprogress
- poj1321 深搜。。呵呵
- 按首字符的大小,进行字符串排序
- List和数组转换
- poj3461 Oulipo
- View控件居中
- 欢迎使用CSDN-markdown编辑器
- ASP.NET 用MultiView和View实现选项卡效果
- Flask 学着用模板 render_template
- 关于使用安装Adobe绿色精简版所需运行库
- SimpleDateFormat使用详解
- Sublime Text3 常用快捷键
- Datagrid的行内编辑,Combobox的级联。
- 《C#高级编程》读书笔记(十三):应用程序域