[置顶] 《windows编程零基础》__1 Hello,World

第一个工程

1)打开Visual Studio,如下地建一个工程

[置顶] 《windows编程零基础》__1 Hello,World_第1张图片

2)选择一个空的工程

[置顶] 《windows编程零基础》__1 Hello,World_第2张图片

3) 新建一个文件

这个不解释了吧,你肯定会添加一个cpp文件的。
[置顶] 《windows编程零基础》__1 Hello,World_第3张图片

4)输入如下代码

#include <windows.h>

#pragma comment(linker, "/entry:\"main\" /subsystem:\"windows\"")

int main(){
	MessageBox(NULL, TEXT("Hello,World"),TEXT("NULL"),  MB_OK);
}

5)按下 Ctrl + F5

此时可以运行程序了,是不是看到了一个小窗口呢?是不是这此代码比较熟悉呢?


是的,事情就是这样,你看到的就是Windows上开发所需要的一切。

代码解释

第一行

第一行是#include <windows.h>,任何Windows平台上的应用程序肯定需要引用一些Windows的函数或者变量,而这些函数或者变量的声明就在Windows.h里面,所以我们需要包含它,这跟大家包含stdio.h一样的道理。

第二行

也许大家看到的Windows程序是以WinMain开头的,然而,你们在这里面看到的是main?有人怀疑我写错了,事实上,我没有写错,所谓的main函数是一个逻辑上的概念,也就是告诉链接器,我这个程序要从哪里开始执行,C(++)里面的入口函数是main,Windows上是WinMain,这些并没有错,当然,也允许我们自己设定入口函数。这里面的 #pragma comment(linker, "/entry:\"main\" /subsystem:\"windows\"") 里面的/entry其实是设置入口函数,/subsystem其实是设置子系统(gui的或者console的),gui的程序是没有黑框框的,console的程序是大家平时看到的一个黑框框,大家的第一次hello,world基本上是交给它的,正如大家的第一次上网基本交给了IE一样。

第三行

第三行是一个函数调用,大家肯定知道的对吧,这个函数调用的是MessageBox,即一个Windows里面的API,定义于user32.dll里面。为了方便大家写程序,我建议大家安装一个叫做msdn的东西,如果大家不知道哪里下载,可以从以下网址下载
http://download.microsoft.com/download/F/D/E/FDE79687-B716-4893-9BE3-1512F40388B1/CHSMSDNX1530343.ISO。然后你在里面输入MessageBox,你会看到如下所说明:
[置顶] 《windows编程零基础》__1 Hello,World_第4张图片
显然,这个文档告诉你MessageBox各参数的用法与说明,具体怎么翻译我不解释了吧,你懂的。

细节说明

TEXT是什么

把鼠标放在TEXT上面,然后按下F12,你会看到如下的说明,其定义等价于如下的:
#ifdef UNICODE
#define TEXT(queto) L##queto
#else
#define TEXT(queto) queto
#endif

从中可以从字面地看出来吧

UNICODE是什么

在C语言中我们可以一般写字符串中都是用“Hello,World”这种写法,而没有上面的那种TEXT("Hello,World")的写法,在Windows里面,为了便于操作系统的移植,使用了两种字符表示,一个是多字节码,一种是UNICODE表示,如果在一个ascii字符串前面加上L,那么它就变成了UNICODE串,比如L"ABC"
可以刚才如下网址:http://baike.baidu.com/view/40801.htm

##是什么

在Windows平台的C语言中有##表示串连接,比如“ABC”##"DEF"你就得到了"ABCDEF"了,这个估计很多人都不知道。这个东西在MFC的实现中用得特别多。

LPTSTR是什么

通过在LPTSTR上按F12,可以看到如下的等价定义

#ifdef UNICODE
#define LPTSTR	wchar_t*
#else
#define LPTSTR	char*
#endif

因为LPTSTR表示字符串,上面已经提到了,在UNICODE中,字符串是UNICODE串,也即是const wchar_t[],在非UNICODE中,字符串是const char*,即const char[]。LPTSTR的使用避免了在不同环境下源码编译的问题。

MessageBox是一个函数?

其实 ,MessageBox不是一个函数,与之相关的函数有两个,MessageBoxA与MessageBoxW,根据是否使用UNICODE串从而定义MessageBox是MessageBoxA还是MessageBoxW,并且,在user32.dll里面同时实现了这两个API,当然MessageBoxA的实现中会调用MessageBoxW。
通过 dumpbin -exports user32.dll可以看到如下的结果
[置顶] 《windows编程零基础》__1 Hello,World_第5张图片
dumpbin -exports可以看出一个dll里面导出了什么函数,这个工具是由visual studio sdk提供的,大家安装完visual sutdio之后就会自动安装这个工具,不需要单独下载。

由于今天不太高兴,就先写第一章节到这里,以后有时间再写,另外,快放暑假了,准备回家休息几个星期。

你可能感兴趣的:([置顶] 《windows编程零基础》__1 Hello,World)