主题:[翻译]WinAPI编程指南
这是一份讲述WinAPI编程的指南,原文为英文,小弟准备陆续的将它翻译过来,一则是为了自己学习,再则是为了那些英文稍弱点的朋友提供点便利。(不过还是忠告一句,英文赶快学好)由于小弟水平有限,翻译的过程中难免有很多错误,请务必指出,小弟必欣然接受!如果您有什么意见或者建议,请直接与我联系:
casm@163.com QQ:21859891(常年隐身,加时请注明来意)
或登陆我的space,URL是:
http://spaces.msn.com/fetag
另外,对回帖的兄弟有点小小的要求。那些“顶”,“赞扬”之类的就免了,小弟是来“讨骂”的^_^ 。我要的是大家的交流,是您的建议。但骂归骂,请不要“伤及无辜”噢,这份文档只是我一个人翻译的,与父母无关。
译者注:API编程正在被人们渐渐的遗忘,现在还在用纯的API来编程的人已经是凤毛麟角了。在MFC,组件级编程泛滥的今天,还有多少人能体会到API的精髓呢?随着程序规模的不断增大,面向对象技术的不断普及,程序员的效率越来越高,但程序员的整体技术却在一步步的下降。封装技术的日臻完善,使编程也变成了普通的劳动。但是一流的程序员,还是在孜孜不倦的追求着背后的真相。
我只是个初学者,出于爱好和share的目的,准备陆续翻译这份Tutorial,如果文中有什么不恰当的地方或者翻译错误的地方,请您指正,我会很乐意接受您的建议!这是我的E-mail:casm@163.com
文档原文:http://www.winprog.org/tutorial/
起步
这份指南的内容
这份指南将要展示给您使用Win32 API来开发windows程序的基本方法。开发语言采用C语言,绝大多数C++编译器也都能够正常编译。事实上,指南中的大部分内容对于调用API的任何语言都是可用的,像JAVA,汇编语言,以及Visual Basic。但我不会用这些语言来编写任何的范例代码,先前也有很多人尝试将这份指南用其他的语言来实现,很可惜,成功的人很少。
这份指南不会教您什么是C语言,也不会教您如何应用特定的编译器(Borland C++, Visual C++,LCC-Win32,等等)。然而,我会在附录中提供一些我个人的使用编译器的经验。
如果您不知道宏或者typedef是什么,或者不知道switch语句是如何工作的,请您现在就放下这份文档,先去找一本介绍C语言的书读一读。
非常重要的注释
通常,在全文中,我会指出一些非常重要的东西,这些是必读的。因为它们常常被人理解的一团糟,如果您不读,您也很有可能陷入其中。
首先:
范例压缩包里的源代码是必读的!我不会在文档内包含全部的代码,只会包含那些与我们正在讨论的内容有关的部分。如果您想详细了解代码在程序中是作用,您必须去参看压缩包内提供的源代码。
其次:
读遍所有的内容!如果您在指南的某个部分有什么疑问,请耐心的继续读下去,很可能这个问题在后面不久就会回答。如果您非要立刻弄清这个问题,请暂时停下来,通过IRC或者Email寻求答案。
另外,请您记住,在课题A中涉及的问题,有可能在B或者C甚至L中才做出解答,所以还是先泛读一遍。
好了,这些就是我想说的全部内容,接下来让我们看一些实际的例子吧。
最简单的Win32程序
如果您完全是个初学者,至少您也要保证能够编译一个基本的windows程序。将下面的代码敲入您的编辑器,如果一切正常,您就能创建一个最基本的程序。
记得,要将它作为一个C源文件来编译,而不是C++源文件。虽然这可能没什么关系,但是,既然我们的代码完全是用C写的,就让它保证从开始的时候就向一个有益的方向前进吧。大多数情况下,都要求您的代码保存为a.c而不是a.cpp。如果这个名字很让您头疼,请将它保存为test.c。
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, "Goodbye, cruel world!", "Note", MB_OK);
return 0;
}
如果程序报错了,首先请您看一下出错的信息您是否理解,在您的编译器的帮助或者联机文档中搜索下这个错误的描述。确保您的程序指明为Win32 GUI程序,而不是控制台程序。很抱歉,对于这个问题,我也没什么办法。因为根据编译器的不同,错误信息的提示也不同。(而且人与人也不同)
也有可能会有一些警告,类似于没有使用WinMain()函数中的参数,这很正常,不用理会。至此,我们已经建立了一个能正常运行的程序,让我们来分析一下这段代码....
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
WinMain函数等价于DOS或者UNIX编程中的main()函数。这是我们的程序执行的入口点。参数的含义如下:
HINSTANCE hInstance
程序执行模块的句柄。(内存中的.exe文件)
HINSTANCE hPrevInstance
在Win32程序中总为NULL
LPSTR lpCmdLine
一个字符串的命令行参数。不包括程序名
int nCmdShow
一个可能传递给ShowWindow()函数的整数。我们稍候会解释。
hInstance主要用来装载资源和执行一些基于其它模块的功能。模块是指装载到程序中的exe或者dll文件。在本指南的大部分内容中,他们都是指exe文件。
hPrevInstance在过去的Win16程序中,用来指向一个已经运行了的程序的实例。现在已经不再使用了,在Win32中,你完全可以忽略这个参数。
调用方式
WINAPI指明了调用的方式,它被定义为_stdcall。即使您不明白,也不用担心。它并不影响我们的学习。记住在这里它是必需的就行了。
Win32数据类型
您可能发现了,许多关键字在windows下面都被重新定义了,例如UINT是unsigned int,LPSTR是char* 等等。至于用哪种写法完全取决于您自己。如果您觉得用char* 要比用LPSTR舒服,您尽可以自由的使用。只是要确定所使用数据类型能够正确的匹配。
其实只是记住几个要点就很容易理解了。LP前缀代表指向长整形的指针(long pointer)。在Win32中,long型是一种陈旧的类型了,不用担心。如果您不知道指针是什么,您有两种选择:1)去找本C的书读一读。 2)继续读下去,弄得一团糟。我强烈建议您选择第一种,但还是有很多人选择第二种(我已经说了哦:) 别怪我没提醒您哦!)
接下来是跟在LP后面的一个表示常量的字符C,LPSTR表示一个指向字符串常量的长指针,它指向的类型是不能够修改的。LPSTR是指向字符串的长指针,没有const关键字,是可以修改的。
casm@163.com QQ:21859891(常年隐身,加时请注明来意)
或登陆我的space,URL是:
http://spaces.msn.com/fetag
另外,对回帖的兄弟有点小小的要求。那些“顶”,“赞扬”之类的就免了,小弟是来“讨骂”的^_^ 。我要的是大家的交流,是您的建议。但骂归骂,请不要“伤及无辜”噢,这份文档只是我一个人翻译的,与父母无关。
译者注:API编程正在被人们渐渐的遗忘,现在还在用纯的API来编程的人已经是凤毛麟角了。在MFC,组件级编程泛滥的今天,还有多少人能体会到API的精髓呢?随着程序规模的不断增大,面向对象技术的不断普及,程序员的效率越来越高,但程序员的整体技术却在一步步的下降。封装技术的日臻完善,使编程也变成了普通的劳动。但是一流的程序员,还是在孜孜不倦的追求着背后的真相。
我只是个初学者,出于爱好和share的目的,准备陆续翻译这份Tutorial,如果文中有什么不恰当的地方或者翻译错误的地方,请您指正,我会很乐意接受您的建议!这是我的E-mail:casm@163.com
文档原文:http://www.winprog.org/tutorial/
起步
这份指南的内容
这份指南将要展示给您使用Win32 API来开发windows程序的基本方法。开发语言采用C语言,绝大多数C++编译器也都能够正常编译。事实上,指南中的大部分内容对于调用API的任何语言都是可用的,像JAVA,汇编语言,以及Visual Basic。但我不会用这些语言来编写任何的范例代码,先前也有很多人尝试将这份指南用其他的语言来实现,很可惜,成功的人很少。
这份指南不会教您什么是C语言,也不会教您如何应用特定的编译器(Borland C++, Visual C++,LCC-Win32,等等)。然而,我会在附录中提供一些我个人的使用编译器的经验。
如果您不知道宏或者typedef是什么,或者不知道switch语句是如何工作的,请您现在就放下这份文档,先去找一本介绍C语言的书读一读。
非常重要的注释
通常,在全文中,我会指出一些非常重要的东西,这些是必读的。因为它们常常被人理解的一团糟,如果您不读,您也很有可能陷入其中。
首先:
范例压缩包里的源代码是必读的!我不会在文档内包含全部的代码,只会包含那些与我们正在讨论的内容有关的部分。如果您想详细了解代码在程序中是作用,您必须去参看压缩包内提供的源代码。
其次:
读遍所有的内容!如果您在指南的某个部分有什么疑问,请耐心的继续读下去,很可能这个问题在后面不久就会回答。如果您非要立刻弄清这个问题,请暂时停下来,通过IRC或者Email寻求答案。
另外,请您记住,在课题A中涉及的问题,有可能在B或者C甚至L中才做出解答,所以还是先泛读一遍。
好了,这些就是我想说的全部内容,接下来让我们看一些实际的例子吧。
最简单的Win32程序
如果您完全是个初学者,至少您也要保证能够编译一个基本的windows程序。将下面的代码敲入您的编辑器,如果一切正常,您就能创建一个最基本的程序。
记得,要将它作为一个C源文件来编译,而不是C++源文件。虽然这可能没什么关系,但是,既然我们的代码完全是用C写的,就让它保证从开始的时候就向一个有益的方向前进吧。大多数情况下,都要求您的代码保存为a.c而不是a.cpp。如果这个名字很让您头疼,请将它保存为test.c。
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, "Goodbye, cruel world!", "Note", MB_OK);
return 0;
}
如果程序报错了,首先请您看一下出错的信息您是否理解,在您的编译器的帮助或者联机文档中搜索下这个错误的描述。确保您的程序指明为Win32 GUI程序,而不是控制台程序。很抱歉,对于这个问题,我也没什么办法。因为根据编译器的不同,错误信息的提示也不同。(而且人与人也不同)
也有可能会有一些警告,类似于没有使用WinMain()函数中的参数,这很正常,不用理会。至此,我们已经建立了一个能正常运行的程序,让我们来分析一下这段代码....
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
WinMain函数等价于DOS或者UNIX编程中的main()函数。这是我们的程序执行的入口点。参数的含义如下:
HINSTANCE hInstance
程序执行模块的句柄。(内存中的.exe文件)
HINSTANCE hPrevInstance
在Win32程序中总为NULL
LPSTR lpCmdLine
一个字符串的命令行参数。不包括程序名
int nCmdShow
一个可能传递给ShowWindow()函数的整数。我们稍候会解释。
hInstance主要用来装载资源和执行一些基于其它模块的功能。模块是指装载到程序中的exe或者dll文件。在本指南的大部分内容中,他们都是指exe文件。
hPrevInstance在过去的Win16程序中,用来指向一个已经运行了的程序的实例。现在已经不再使用了,在Win32中,你完全可以忽略这个参数。
调用方式
WINAPI指明了调用的方式,它被定义为_stdcall。即使您不明白,也不用担心。它并不影响我们的学习。记住在这里它是必需的就行了。
Win32数据类型
您可能发现了,许多关键字在windows下面都被重新定义了,例如UINT是unsigned int,LPSTR是char* 等等。至于用哪种写法完全取决于您自己。如果您觉得用char* 要比用LPSTR舒服,您尽可以自由的使用。只是要确定所使用数据类型能够正确的匹配。
其实只是记住几个要点就很容易理解了。LP前缀代表指向长整形的指针(long pointer)。在Win32中,long型是一种陈旧的类型了,不用担心。如果您不知道指针是什么,您有两种选择:1)去找本C的书读一读。 2)继续读下去,弄得一团糟。我强烈建议您选择第一种,但还是有很多人选择第二种(我已经说了哦:) 别怪我没提醒您哦!)
接下来是跟在LP后面的一个表示常量的字符C,LPSTR表示一个指向字符串常量的长指针,它指向的类型是不能够修改的。LPSTR是指向字符串的长指针,没有const关键字,是可以修改的。