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