当前位置:C++技术网 > 资讯 > Windows零基础入门:1.6 Win32 API如何获取和使用

Windows零基础入门:1.6 Win32 API如何获取和使用

更新时间:2015-07-26 21:08:56浏览次数:1+次

    前面一些小节,大家看完后,或许还不清楚Win32 API到底如何写程序,或者说,这些所谓的API函数如何去使用呢?去哪去找这些函数呢?我们怎么知道这些函数如何使用呢?
    前面所有内容,都是在给你尽可能的解释各种疑惑,在你完全没有接触到Windows方面的编程,你会Windows等操作系统方面的编程十分陌生。即使很多同学在老师的带领下学完了Windows程序设计,或者看了一些培训机构的视频等,依然对Windows编程似懂非懂,其实是,只知道写点代码,而其他方面,都一无所知。很多课程根本不跟你将太多的为什么,不会追根究底,不会溯源,只讲解了现在应该如何使用而已,稍微好点的就是多讲了一些思想性的东西。而他们的教学重点,往往忽略了技术的发展和技术背景等等,也就导致了现在绝大多数学生一看到技术发展史之类的,技术背景之类的就跳过了。也没有几个人能够认真看过一本书的前沿和版本说明。是不是你也中枪了呢?
    有时候,我们学习太功利了,急于求成,往往直奔主题。然而,不为人知的很多技术要理解的好,与发展有着密切关系。你知道这段技术背景,你也就知道这个技术为什么诞生为什么这么受欢迎,为什么一直使用到现在等等。当然,我会竭尽所能将讲解到的相关必要的背景介绍给大家,而无聊的时间发展这类的就不谈了。我们了解一个技术的发展,不是了解什么时间诞生了什么技术,这个是没有意义的。而教科书最喜欢搞这个发展背景。我们需要了解的发展背景,是这个技术在什么时候因为什么需求或者什么矛盾而产生的。举个例子说,IPv6,这个技术学过网络的人应该都知道。其实这个技术也不难,因为IPv4地址段短了,现在的互联网设备太多了,分配不过来了,因此,就造成了发展障碍。这样就提出了扩展IP地址的长度,这是现在的IPv6。然而扩展长度,不是简单的让IP长度变长那么简单,还涉及到多余的地址段,因为IPv6太长了,目前用不完,因此要合适的分段。还有,现在的普遍使用的是IPv4,也不可能一下子就替换成IPv6,因此就有转换技术,将IPv4和IPv6做地址转换。诸如此类的,各种技术点之间是有相关联系的,如果能够将这些因果发展串在一起,你会觉得这些技术学得很有意思。而课本则是将这些因果关系忽略了,一条条列出这些技术要点,讲出来即可。教学的课本基本都是这个模式,这些细节的东西就依赖老师了,如果老师讲,你就走运,也就学的有兴趣,如果老师不讲,那你就会学的很乏味了,慢慢就讨厌这门课了。实际上,每一门课都会很有意思,而在中国,这些就都靠老师了。然而,在应试教育模式下,可想而知,这些效果如何,我也不多说了。如果效果好,我也不必在此写这个教程了。
    而相对来说,国外的很多经典著作,对每一个技术点的发展都有详细的交待,让我们非常清楚一个技术怎么来的,有什么用,有什么优缺点,并不是罗列出来,而是根据发展的过程讲述,就和讲故事一样。你不仅学的很好,而且学的静静有味。这些也是评判一本书是否适合自学的标准之一了。千万不要将教科书拿出来入门学习,特别是零基础入门。
    好了,上面讲了这些额外的宝贵经验,我们的课程以及我们C++技术网的重点在于教会你如何认知和思考,以及各种学习方法和经验,所以,经常在课程里根据情况贯穿这些东西,教会你学习,我想你不会觉得这个多余吧。
    那么下面来说说API的使用问题。其实说起这个主题,对于编程没有找到感觉的人来说,确实需要点明一下,而对于编程有感觉的来说,这些似乎有点多余。不过,作为零基础入门,我必须说清楚。还有,可能会延伸更多方面的介绍,你还是好好看看吧。
    在学习这个课程时,我想你应该是学习了C语言编程的,至于说还没有学习C++语言编程,这个倒是没什么关系。前面课程说了,Windows编程是平台编程,与语言无关,一般的编程语言都可以,只是每一种语言的实现程度而已。C/C++语言可以直接调用系统的函数,而其他语言可能是包装了N层才可以调用,有的语言只能调用部分函数,只是它没有实现更多罢了。所以,只要你熟悉C语言的语法,就可以了。如果连C语言也不熟悉,请先学一下C语言编程吧。推荐的零基础C语言编程入门书籍为《C++ Primer Plus》,在网站可以搜到这本电子书免费下载,不过建议进去书籍介绍的书店去购买一本纸质书籍,学习效果好多了,方便来回翻阅。书店的书也是我们为大家挑选的,价格信誉等都有所保障。不多说这个了,就是一句话,如果基本的C语言都没学过,那么后面学习的Windows编程课程里涉及到代码,你看不懂的。我们网站也在推出C语言的免费教程,建议也跟着学习,有问题及时提出来,这样比一个人自学效果强百倍了。
    上面强调了这么多,是我想起来,我要拿C语言来作比较介绍Win32 API如何使用。我们知道,C语言中有很多可以直接使用的函数如printf()和scanf()等。我们并没有事先声明什么,拿来就用。因为在C/C++语言中,函数使用前一定要先声明,或者函数定义的位置在调用函数的前面,否则是不能够调用的。而printf函数为什么能够直接使用呢?虽然我们什么声明也没有写,也可以直接使用。对于声明、定义、初始化等概念的深入理解复习,请阅读《C/C++声明定义初始化和赋值独家剖析深刻理解》,这里就不多说了,文章讲的很详细。而Windows编程使用C/C++语言来写,自然要遵从这些规则。而C语言中,printf要使用,就需要包含一个文件,叫做stdio.h头文件。在这个头文件中,包含了这些基本函数的声明了,而包含头文件是在调用函数之前,就相当于声明了这些函数。这样也就是符合调用函数前先声明的规则的。而这些头文件是安装编程环境时早就提供好了的。这些文件都是在相关的文件夹中保存好的。事实上,这些函数可以认为是一种C语言的API函数(对外开发的函数就叫做API函数,这是一种理解方式),就看你怎么理解了。C语言的其他库函数,都是如此,只要包含了相关的头文件,就可以直接使用。
    同样,Windows的API函数,实际上也是如此。它并没有什么特别之处。当然我们需要清楚的是,这些库函数的头文件我们是可以找到的,然而很多函数的具体实现代码,我们是找不到对应的源代码文件,即.c文件。因为他们是被编译在dll文件中保存起来的。dll就像一个保险柜,将相关函数的具体实现,封装锁起来了。所以我们都不能直接查看,但是它提供了引用的方法,就是提供了头文件,告诉我们,这个保险柜(dll文件)里面,有哪些函数可以使用,即你包含了这个头文件,你就可以使用头文件声明的函数了。这也是为什么叫做这些函数为接口的意思。因为这些函数是对外开发使用的,然而内部具体如何实现,我们不知道,可能它内部还调用了其他没有公开的函数,很多函数都是这样的。而我们只要知道的就是,这个函数需要什么参数,结果返回什么就可以知道这个函数如何使用了。这些函数的头文件和函数的声明就好像是一个窗口,通过这个窗口,我们就可以使用这些函数,通过这些函数,我们就可以完成一定的功能,而函数具体如何完成功能,我们不必知道。这个道理,相信你清楚知道,对于接口概念会有一个新的认识,而不是那么抽象了。
    那么我们在安装VS等工具时,一般都会安装了C运行时库,在电脑的“控制面板”->“程序和功能”下,我们可以看到所有安装的程序的列表,其中就可以看到,C/C++的运行时库,这些库有相关的dll支持。
C/C++运行时库
    什么dll名称,就不在此展开了。只是一个名字罢了,比如 msvcrt.dll这类的函数,其中的vcrt表示的是Visual C++ RunTime的意思,就是VC++运行的库支持。还有其他这样的dll文件,名字可以自己去了解一下。
    而Windows中,同样如此。只是换了个dll名字和函数名称等,实现功能不一样罢了,道理是一样的。那么Win32 API的使用,也是要根据需要,选择包含不同的头文件即可。使用函数时,直接写函数名即可调用。而Windows为了方便,就提供了一个头文件,包含了所有常用的函数的头文件,类似于stdio.h一样。这个Windows头文件就是Windows.h头文件。有时候,你会觉得某个人写的也给Windows程序好小,好牛逼的样子。如果你对你的程序非常的清楚,也想尽可能缩小程序大小,那么请只包含你要用到的函数需要包含的头文件,而不是包含这个通用的头文件Windows.h,这样可以让你的程序尽可能小。而Windows.h是为了方便,不需要你一个个去包含了。至于这个头文件中具体有什么,你进入看看即可。后面后详细了解这个头文件的。
    Windows的API函数,和C语言的库函数一样,都设计成面向过程的全局函数,只要你包含了对于的头文件,就可以直接使用。没有什么类,没有什么继承关系的,这些函数都是全局的函数。所以,C/C++语言中,使用Win32 API就和使用C语言的库函数一样简单。而在此之前,你以为很复杂是吗?那么也就是说,Windows的API函数,并不只限于在Windows中使用哦。既然作为一个库函数一样的,我们只要包含了这个头文件,即可使用。那么我们在控制台程序中,包含了Windows.h同样可以执行Windows的功能哦,比如说显示一个消息框,而不是printf哦。下面是简单的代码实现,你可以运行一下。
#include <Windows.h>
#include <stdio.h>
void main()
{
    printf("你好,我是控制台输出的信息!");
    MessageBox(NULL,L"Hello,控制台里的消息框哦!",L"特别提示",MB_OK|MB_ICONINFORMATION);
}

    L表示的是宽字符,这是MessageBox消息框函数的参数类型。后面你就知道了。MessageBox消息框函数就是一个Win32的最简单的API函数了。如果你迫不及待的想了解学习这个函数,请看《Windows API最简单的消息函数MessageBox分析
    下面是运行的截图:
控制台的消息框
    而Windows中,各种功能需要的头文件,对应的有一个头文件,同时还有一个dll文件。头文件提供使用函数等的声明,而dll就是具体的函数实现代码。dll文件是一堆被编译成二进制存起来的代码文件,防止被破解。也就是防止你查看内部的函数如何实现。这也就是Windows不开源的一个技术。而一般的开源项目,提供的都是源文件如.c和.cpp等代码文件,你可以看到源文件里面的函数如何实现,如果你不想看函数实现,也可以一样包含头文件就可以使用。如果是开源的,你就可以知道,你用的函数内部到底是如何实现的,而不开源,那么你要了解一个函数如何使用,就采用查阅资料的方式。而最经典而推荐的方式,就是查阅微软提供的MSDN,这个是微软提供的所有API函数的使用说明,介绍了API的函数的参数、返回值以及各种注意事项,还有各种内部机制等。当然,都是描述性的,至于具体是不是如描述一般,你得去试验,毕竟实践才是最正确的。防止故意歪解和忽略,甚至是错误的解释。所以,也不要完全相信API所说,虽然90%以上都是正确的。我们始终要保持一颗质疑的态度求知。所以,在课程中,如果觉得哪里不对或者不准确的地方,请一定要指出来哦。当然,还有不懂的地方,同样要说出来。那么MSDN在哪呢?一般在带有MSDN的VS安装包中,都可以安装MSDN,如果没有,那么就找独立的MSDN安装包安装。如果你找不到,我们网站里面已经有提供了相关的VS版本,基本都带有MSDN,如果没有,请反馈一下,我们会后续补充给大家下载安装。