Win32編程API 基礎篇 -- 1.入門指南 根據英文教程翻譯


入門指南

本教程是關於什么的

  本教程的目的是向你介紹使用win32 API編寫程序的基礎知識(和通用的寫法)。使用的語言是C,但大多數C++編譯器也能成功編譯,事實上,教程中的絕大多數內容都適用於任何可以連接API的語言,包括Java、Assembly和Visual Basic;我不會向你呈現任何跟這些語言相關的代碼,這需要你在本教程的指導下自己去完成,有一些人在本API的基礎上使用其他語言進行編程取得了相當的成功。

  本教程不會教你C語言,也不會告訴你怎樣去運行你特定的編譯器(Borland C++,Visual C++,LCC-Win32等)然而我將花一些時間在附錄中提供一些使用編譯器的知識的筆記。

  如果你不知道宏或類型定義是什么或者一個開關語句時如何工作的,那么現在回頭,先找一本關於C語言的好書或教程好好研究學習。

 

注意事項

  在整個教程中,有時我會確切地指出某些很重要的地方,這些地方的內容需要你好好研讀。因為這些地方讓很多人搞砸了,如果你沒有好好研讀的話,那你也很可能搞砸。

第一個地方是:

  在ZIP壓縮文件中提供的代碼是必看的!我沒有在教程中提供所有的代碼,只包含與我正在討論部分相關的代碼,為了了解這段代碼如何嵌入程序中,你必須看一看在ZIP文件中的源碼。

 

第二個方面是:

  完整地看完所有的內容!如果你在本教程的某個小節中產生疑問,請保持耐心閱讀,你的疑問可能會在接下來的內容中被解決。如果你無法忍受帶着疑問閱讀,那么在向我發來郵件之前,至少瀏覽和搜索文檔中的剩余內容。

  還有一件事情需要記住的是,你關於主題A的一些疑問可能會在對B或C甚至L的討論中被回答,所以遇到問題時多讀讀文檔尋找答案。

  OK,上面就是一些在教程正式開始之前需要說明白的東西和注意事項,現在讓我們來嘗試一些實際的代碼。

 

最簡單的Win32程序

  如果你是一個徹徹底底的菜鳥,那么請保證至少你能編譯這個最基本的窗口應用。把一下的代碼復制到你的編譯器中,如果沒出現什么問題,你應該會看到一個最簡單的窗口。

  記住把代碼當成C編譯,而不是C++,這可能沒什么關系,但因為這里所有的代碼都是C的代碼,我們應該有個合理正確的開始。在大多數情況下,你應該把你的代碼加入到.c文件中而不是.cpp文件中,如果你感覺很蛋疼,把代碼放到test.c文件中然后編譯它就完了。

1 #include <windows.h>
2 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 3     LPSTR lpCmdLine, int nCmdShow) 4 { 5     MessageBox(NULL, "Goodbye, cruel world!", "Note", MB_OK); 6     return 0; 7 }

  如果代碼無法正常運行,先看看都有哪些報錯然后把它解決,如果你不明白報錯的內容,請查閱適用於你的編譯器的幫助或任何其他文檔。確保你新建一個Win32 GUI項目(不是控制台應用程序),不管你用的是什么編譯器,關於這一塊,很遺憾我無法提供更多幫助,因為不同編譯器的標准是不一樣的。

  你可能得到了一些警告,告訴你沒有使用適用於WinMain()的參數,這沒關系,能編譯通過就好。現在我們已經建立了一個可以通過編譯的最簡單的程序,讓我們對這段代碼做進一步的講解。

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

  WinMain()相當於DOS或UNIX程序的main(),這是你的程序開始執行的地方,參數列表如下:

HINSTANCE hInstance

  程序可執行模塊(在內存中的可執行文件)的句柄

  官方API(處理程序的可執行模塊) 一般用來加載資源和執行其他任務的基礎模塊(加載到你程序中的exe或dll模塊) dll: dynamic link library

  (PS.關於句柄:句柄(handle)是一種資源的標識; 操作系統要管理這些資源,都是通過句柄來找到對應的資源。 句柄有點類似於指針, 資源都會占用一定的內存,當我們需要使用這些資源的時候,就需要獲得這些內存中的資源,通過句柄就可以訪問這些內存。

按資源的類型,可以將句柄細分成 圖標句柄(HICON),光標句柄(HCURSOR),窗口句柄(HWND),應用程序實例句柄(HINSTANCE))

 

HINSTANCE hPrevInstance

  對於win32程序來說通常是NULL,對win16程序有用,對win32無用

 

LPSTR lpCmdLine

  一個字符串的命令行參數,不包括程序名,跟打開文件的路徑有關,默認為空

 

int nCmdShow

   一個可能會傳遞給ShowWindow()方法的一個整數值,在接下來的內容中我們會講到

 

  hInstance用於加載資源和其他基於單個窗口模塊的任務,這里所有的模塊是加載進你的程序中的EXE或DLL,對本教程中的大部分內容來說,我們只需要關注一個模塊,那就是EXE。

  hPrevInstance只用在Win16程序中,作為程序實例化之前的一個預處理的句柄,在Win32中不再使用這個參數,在這里你可以忽略它。

 

調用的慣例

  WINAPI指定了參數調用的慣例,這個慣例被定義為_stdcall的標准。如果你不知道這是什么意思,不用擔心,這對我們接下來的教程沒有什么影響,你只需要知道在這里需要這樣指定。

 

Win32的數據類型

  你會發現很多通用的關鍵字或類型在win32中有指定的定義,在win32中,我們用UINT來表示unsigned int,用LPSTR來表示char*等。。。要選擇哪種表達方式取決於你,如果你感覺使用char*比用LPSTR更舒服,那就用char*吧!你只需要確保替換之前明白是哪種類型

  記住一些特定的定義,它很容易被解釋說明!一個LP的前綴代表Long Pointer,在Win32中Long是被廢棄的所以我們無需擔心指針加不加Long的問題,但如果你連指針都不懂,你可以選擇:1)找本C的書或教程看看 2)繼續看本教程,接着一臉懵逼吧。我建議不懂的人選擇1,但大多數不懂的人選擇2,接下來的東西沒看懂的話別怪我沒提醒你。

  接着在LP后面的C表示這是個常量指針,所以LPCSTR表示一個指向常量字符串的指針,它不可改變;以此類推LPSTR表示一個非常量指針,它是可改變的。

你可能會看到一個T混雜在里面,我們現在不需要關心這個,除非你是使用Unicode編碼,否則T不代表什么。

 

之所以想把它翻譯過來是因為這個教程很好,而網上又沒有找到對應的翻譯,由於本人英文水平所限,只能翻譯到這個程度了,有紕漏還望多多指出,附上本篇翻譯的英文原版教程地址:http://www.winprog.org/tutorial/start.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM