Hello Everybody This is beyondcode
大家好 再次自我介紹一下 我是beyondcode, 用于幫助一些在Windows API編程上有疑惑的,納悶的,迷惑的新手朋友們。
先解釋一些術(shù)語或名詞吧!SDK是Software Development Kit的簡寫,也就是軟件開發(fā)包的意思,其中就包含了我們寫程序要用到的一些頭文件,庫,工具,幫助文檔之類的。
Windows API編程是指調(diào)用Windows的接口函數(shù)來進(jìn)行程序的編寫,例如MessageBox就是一個(gè)API函數(shù)或者說接口函數(shù)。怎么說都可以,自己理解就行。如果你連這個(gè)都不太懂,我想也不會(huì)搜到這篇文章了吧~·
為什么做這個(gè)系列教程呢,請(qǐng)聽我一一道來先,最近遇到一些事一些人,讓我真的感覺在這方面的引導(dǎo)入門文章真的很是匱乏,加上Windows SDK頭文件中那些復(fù)雜,龐大,’煩人’的宏定義與數(shù)據(jù)類型定義,對(duì)于一個(gè)新手來說(我所說的新手不單只剛接觸編程的,還特指那些在其他語言領(lǐng)域有比較高造詣的朋友) 一個(gè)純SDK寫的helloworld程序都算是一個(gè)有些困難和挑戰(zhàn)的任務(wù)了吧。 本著幫助別人,高興自己的原則,我有了這個(gè)打算,當(dāng)然對(duì)自己以前所學(xué),所經(jīng)歷做一次回憶,也是這次計(jì)劃的一部分。
聲明一下,本系列教程是面向廣大初次接觸WIN32 SDK程序編寫的新手朋友們的,如果你是高手,一笑而過吧~當(dāng)然,除了一笑而過,也多謝你們提出指正文章中的錯(cuò)誤,以免我誤人子弟啊~~謝謝
Ok 廢話不多說,進(jìn)入正題,今天第一篇,講什么?對(duì)于一個(gè)新人來說,第一次接觸SDK編程或者說API編程,什么最迷惑你們的,我們講它,我覺得Windows SDK中那’煩人’的數(shù)據(jù)類型定義和宏定義應(yīng)該算這個(gè)很角色吧。
其實(shí)微軟的本意也是善良的,為了減輕程序員的負(fù)擔(dān),和為了編程的方便,才花了那么多心思與精力定義出了這么一大套數(shù)據(jù)類型與宏定義,這也是我為什么在之前說它煩人都是加上引號(hào)的原因,因?yàn)樗皇钦娴臒┤?,熟練了,你不但不覺得它煩,反而離不開它了,呵呵,日久深情也就是這么來的。
呵呵 先看幾個(gè)數(shù)據(jù)類型定義吧
typedef float FLOAT;
typedef long LONG;
typedef short SHORT
typedef int INT;
typedef char CHAR;
float, long, short, int, char 這幾個(gè)數(shù)據(jù)類型都是大家熟悉的C/C++的數(shù)據(jù)類型吧,微軟將他們重新定義了一下,很簡單,就是改變名字為大寫了,這樣做的目的大概是微軟為了編碼的方便吧,輸入法大小寫都不用切換了,多人性化呀 呵呵。
再看幾個(gè)數(shù)據(jù)類型定義的例子
typedef unsigned int UINT;
typedef unsigned int UINT32;
typedef signed int INT32;
typedef unsigned long DWORD;
typedef unsigned short WORD;
這些數(shù)據(jù)類型的定義就稍微有實(shí)質(zhì)性作用一些了,注意觀察,他們都比較短了,不用寫那么長了,而且也還比較直觀,如果我要定義一個(gè)無符號(hào)整形, 我就不用寫 unsigned int a;
這么長了,只需UINT a; 多簡單, 多明了,所以我說其實(shí)不煩人吧。
其中DWORD 算是SDK程序中可以經(jīng)常看見的一個(gè)數(shù)據(jù)類型了,經(jīng)常被使用,很多新手也就不明白,這是什么數(shù)據(jù)類型啊,現(xiàn)在看到了吧,其實(shí)就是無符號(hào)長整形unsigned long,給他取了個(gè)外號(hào)而已··沒什么技術(shù)含量,所以不用怕,程序中究竟是寫unsigned long 還是DWORD都看你自己心情,因?yàn)樗麄兌即硗环N數(shù)據(jù)類型。
下面再介紹2個(gè)很重要的,經(jīng)常被使用到的,無處不在的數(shù)據(jù)類型WPARAM,LPARAM
先看看他們定義吧
typedef LONG_PTR LPARAM;
typedef UINT_PTR WPARAM;
先告訴你,這2個(gè)數(shù)據(jù)類型很重要,不是危言聳聽,以后你寫SDK程序就懶?,看他脡q畝ㄒ迦縞希行┟院? 別,我們一步一步分析,我們分析LPARAM。首先定義LPARAM 為LONG_PTR也就是用LPARAM的地方也就可以寫成LONG_PTR,LONG_PTR又是被定義成什么的呢?
typedef long LONG_PTR;
看到了嗎? 也就是long 所以歸根結(jié)底,LPARAM 就是long型,所有LPARAM型的變量,你都可以直接使用long數(shù)據(jù)類型代替。不過不推薦這樣,至于為什么,各位思考思考呢~~
以上這些數(shù)據(jù)類型是參考MSDN中的說明,或者可以查看WinDef.h這個(gè)頭文件查看這些Windows數(shù)據(jù)類型的定義,那么也請(qǐng)各位自己推推看LARAM和WPARAM的真面目吧~
各位朋友在推導(dǎo)的過程中可能發(fā)現(xiàn)LONG_PTR的定義是這樣寫的
#if defined(_WIN64)
typedef __int64 LONG_PTR;
#else
typedef long LONG_PTR;
#endif
這是什么意思呢,能看懂英文都能知道這在定義些什么,如果定義了 _WIN64這個(gè)宏 那么就定義 LONG_PTR 為 __int64,否則定義LONG_PTR為long。 很簡單吧 也就是說如果_WIN64這個(gè)宏在前面被定義了,那么這里的LONG_PTR就被定義為__int64這個(gè)在64位編程下的數(shù)據(jù)類型,否則就定義為long型,這樣說應(yīng)該比較好理解了吧。在這里,各位就不必深究__int64了, 在目前的主流32位編程下很少使用它啦。理解就ok了。這樣定義是微軟為了程序員編寫的程序能在32位與64位下都能編譯而采用的伎倆。
有關(guān)這些Windows的數(shù)據(jù)類型,想查看他們的真面目,其實(shí)很簡單,在VC6.0,VS2008 這些集成開發(fā)環(huán)境里面,你只需要在一個(gè)數(shù)據(jù)類型上面點(diǎn)擊右鍵,在彈出菜單中選擇‘Goto Defination’ 或者是 ‘查看定義’就可以看到了,如果看到的還不是最終面目,在繼續(xù)上面步驟。直到看到它的本質(zhì)數(shù)據(jù)類型為止。通過這樣,新手對(duì)于Windows的這些復(fù)雜的數(shù)據(jù)類型定義也就有了根本的認(rèn)識(shí),不再是迷迷糊糊,在以后的編程中也就不會(huì)出現(xiàn)不知道用哪種數(shù)據(jù)類型或者哪些數(shù)據(jù)類型之間可以相互轉(zhuǎn)換的情況了。不過還需要多多觀察與練習(xí)才是啊~~
下面再來看一看windows中定義的一些宏
#define VOID void
#define CONST const
2個(gè)最簡單的宏,也是只變成大寫而已,難道又是為了方便程序員不切換輸入法?還真的人性化呀。
Windows SDK中的宏定義是最龐大的,最復(fù)雜的,但也是最靈活的,為什么這樣說,先不告訴你,我會(huì)在以后的系列文章中一點(diǎn)一點(diǎn)的講解,累積,因?yàn)樘嗔?,也比較復(fù)雜,我們就采取在需要用到的時(shí)候才講解它,目前看來還沒這個(gè)必要了解那么多,就了解上面2個(gè)很簡單的好了,像其他如:WINAPI CALLBACK GetWindowText 這些宏現(xiàn)在講了不但記不住還會(huì)增加你們的負(fù)擔(dān)。,我們就在以后要用到的時(shí)候再做講解。
到這里第一篇系列文章的內(nèi)容也就差不多了。新手朋友們哪些地方迷惑的,提出來,我可以考慮是否加在后續(xù)的文章中進(jìn)行解說。
大家好 再次自我介紹一下 我是beyondcode, 用于幫助一些在Windows API編程上有疑惑的,納悶的,迷惑的新手朋友們。
先解釋一些術(shù)語或名詞吧!SDK是Software Development Kit的簡寫,也就是軟件開發(fā)包的意思,其中就包含了我們寫程序要用到的一些頭文件,庫,工具,幫助文檔之類的。
Windows API編程是指調(diào)用Windows的接口函數(shù)來進(jìn)行程序的編寫,例如MessageBox就是一個(gè)API函數(shù)或者說接口函數(shù)。怎么說都可以,自己理解就行。如果你連這個(gè)都不太懂,我想也不會(huì)搜到這篇文章了吧~·
為什么做這個(gè)系列教程呢,請(qǐng)聽我一一道來先,最近遇到一些事一些人,讓我真的感覺在這方面的引導(dǎo)入門文章真的很是匱乏,加上Windows SDK頭文件中那些復(fù)雜,龐大,’煩人’的宏定義與數(shù)據(jù)類型定義,對(duì)于一個(gè)新手來說(我所說的新手不單只剛接觸編程的,還特指那些在其他語言領(lǐng)域有比較高造詣的朋友) 一個(gè)純SDK寫的helloworld程序都算是一個(gè)有些困難和挑戰(zhàn)的任務(wù)了吧。 本著幫助別人,高興自己的原則,我有了這個(gè)打算,當(dāng)然對(duì)自己以前所學(xué),所經(jīng)歷做一次回憶,也是這次計(jì)劃的一部分。
聲明一下,本系列教程是面向廣大初次接觸WIN32 SDK程序編寫的新手朋友們的,如果你是高手,一笑而過吧~當(dāng)然,除了一笑而過,也多謝你們提出指正文章中的錯(cuò)誤,以免我誤人子弟啊~~謝謝
Ok 廢話不多說,進(jìn)入正題,今天第一篇,講什么?對(duì)于一個(gè)新人來說,第一次接觸SDK編程或者說API編程,什么最迷惑你們的,我們講它,我覺得Windows SDK中那’煩人’的數(shù)據(jù)類型定義和宏定義應(yīng)該算這個(gè)很角色吧。
其實(shí)微軟的本意也是善良的,為了減輕程序員的負(fù)擔(dān),和為了編程的方便,才花了那么多心思與精力定義出了這么一大套數(shù)據(jù)類型與宏定義,這也是我為什么在之前說它煩人都是加上引號(hào)的原因,因?yàn)樗皇钦娴臒┤?,熟練了,你不但不覺得它煩,反而離不開它了,呵呵,日久深情也就是這么來的。
呵呵 先看幾個(gè)數(shù)據(jù)類型定義吧
typedef float FLOAT;
typedef long LONG;
typedef short SHORT
typedef int INT;
typedef char CHAR;
float, long, short, int, char 這幾個(gè)數(shù)據(jù)類型都是大家熟悉的C/C++的數(shù)據(jù)類型吧,微軟將他們重新定義了一下,很簡單,就是改變名字為大寫了,這樣做的目的大概是微軟為了編碼的方便吧,輸入法大小寫都不用切換了,多人性化呀 呵呵。
再看幾個(gè)數(shù)據(jù)類型定義的例子
typedef unsigned int UINT;
typedef unsigned int UINT32;
typedef signed int INT32;
typedef unsigned long DWORD;
typedef unsigned short WORD;
這些數(shù)據(jù)類型的定義就稍微有實(shí)質(zhì)性作用一些了,注意觀察,他們都比較短了,不用寫那么長了,而且也還比較直觀,如果我要定義一個(gè)無符號(hào)整形, 我就不用寫 unsigned int a;
這么長了,只需UINT a; 多簡單, 多明了,所以我說其實(shí)不煩人吧。
其中DWORD 算是SDK程序中可以經(jīng)常看見的一個(gè)數(shù)據(jù)類型了,經(jīng)常被使用,很多新手也就不明白,這是什么數(shù)據(jù)類型啊,現(xiàn)在看到了吧,其實(shí)就是無符號(hào)長整形unsigned long,給他取了個(gè)外號(hào)而已··沒什么技術(shù)含量,所以不用怕,程序中究竟是寫unsigned long 還是DWORD都看你自己心情,因?yàn)樗麄兌即硗环N數(shù)據(jù)類型。
下面再介紹2個(gè)很重要的,經(jīng)常被使用到的,無處不在的數(shù)據(jù)類型WPARAM,LPARAM
先看看他們定義吧
typedef LONG_PTR LPARAM;
typedef UINT_PTR WPARAM;
先告訴你,這2個(gè)數(shù)據(jù)類型很重要,不是危言聳聽,以后你寫SDK程序就懶?,看他脡q畝ㄒ迦縞希行┟院? 別,我們一步一步分析,我們分析LPARAM。首先定義LPARAM 為LONG_PTR也就是用LPARAM的地方也就可以寫成LONG_PTR,LONG_PTR又是被定義成什么的呢?
typedef long LONG_PTR;
看到了嗎? 也就是long 所以歸根結(jié)底,LPARAM 就是long型,所有LPARAM型的變量,你都可以直接使用long數(shù)據(jù)類型代替。不過不推薦這樣,至于為什么,各位思考思考呢~~
以上這些數(shù)據(jù)類型是參考MSDN中的說明,或者可以查看WinDef.h這個(gè)頭文件查看這些Windows數(shù)據(jù)類型的定義,那么也請(qǐng)各位自己推推看LARAM和WPARAM的真面目吧~
各位朋友在推導(dǎo)的過程中可能發(fā)現(xiàn)LONG_PTR的定義是這樣寫的
#if defined(_WIN64)
typedef __int64 LONG_PTR;
#else
typedef long LONG_PTR;
#endif
這是什么意思呢,能看懂英文都能知道這在定義些什么,如果定義了 _WIN64這個(gè)宏 那么就定義 LONG_PTR 為 __int64,否則定義LONG_PTR為long。 很簡單吧 也就是說如果_WIN64這個(gè)宏在前面被定義了,那么這里的LONG_PTR就被定義為__int64這個(gè)在64位編程下的數(shù)據(jù)類型,否則就定義為long型,這樣說應(yīng)該比較好理解了吧。在這里,各位就不必深究__int64了, 在目前的主流32位編程下很少使用它啦。理解就ok了。這樣定義是微軟為了程序員編寫的程序能在32位與64位下都能編譯而采用的伎倆。
有關(guān)這些Windows的數(shù)據(jù)類型,想查看他們的真面目,其實(shí)很簡單,在VC6.0,VS2008 這些集成開發(fā)環(huán)境里面,你只需要在一個(gè)數(shù)據(jù)類型上面點(diǎn)擊右鍵,在彈出菜單中選擇‘Goto Defination’ 或者是 ‘查看定義’就可以看到了,如果看到的還不是最終面目,在繼續(xù)上面步驟。直到看到它的本質(zhì)數(shù)據(jù)類型為止。通過這樣,新手對(duì)于Windows的這些復(fù)雜的數(shù)據(jù)類型定義也就有了根本的認(rèn)識(shí),不再是迷迷糊糊,在以后的編程中也就不會(huì)出現(xiàn)不知道用哪種數(shù)據(jù)類型或者哪些數(shù)據(jù)類型之間可以相互轉(zhuǎn)換的情況了。不過還需要多多觀察與練習(xí)才是啊~~
下面再來看一看windows中定義的一些宏
#define VOID void
#define CONST const
2個(gè)最簡單的宏,也是只變成大寫而已,難道又是為了方便程序員不切換輸入法?還真的人性化呀。
Windows SDK中的宏定義是最龐大的,最復(fù)雜的,但也是最靈活的,為什么這樣說,先不告訴你,我會(huì)在以后的系列文章中一點(diǎn)一點(diǎn)的講解,累積,因?yàn)樘嗔?,也比較復(fù)雜,我們就采取在需要用到的時(shí)候才講解它,目前看來還沒這個(gè)必要了解那么多,就了解上面2個(gè)很簡單的好了,像其他如:WINAPI CALLBACK GetWindowText 這些宏現(xiàn)在講了不但記不住還會(huì)增加你們的負(fù)擔(dān)。,我們就在以后要用到的時(shí)候再做講解。
到這里第一篇系列文章的內(nèi)容也就差不多了。新手朋友們哪些地方迷惑的,提出來,我可以考慮是否加在后續(xù)的文章中進(jìn)行解說。

