《windows編程零基礎》__1 Hello,World

第一個工程

1)打開Visual Studio,如下地建一個工程


2)選擇一個空的工程


3) 新建一個文件

這個不解釋了吧,你肯定會添加一個cpp文件的。

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,你會看到如下所說明:

顯然,這個文檔告訴你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可以看到如下的結果

dumpbin -exports可以看出一個dll裏面導出了什麼函數,這個工具是由visual studio sdk提供的,大家安裝完visual sutdio之後就會自動安裝這個工具,不需要單獨下載。

由於今天不太高興,就先寫第一章節到這裏,以後有時間再寫,另外,快放暑假了,準備回家休息幾個星期。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章