您的位置:首页 > 其它

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。其定义如下:

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函数,推出进程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: