第一個工程
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的東西,如果大家不知道哪裏下載,可以從以下網址下載
顯然,這個文檔告訴你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"
##是什麼
在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之後就會自動安裝這個工具,不需要單獨下載。
由於今天不太高興,就先寫第一章節到這裏,以後有時間再寫,另外,快放暑假了,準備回家休息幾個星期。