(台下上來一東北民工:小子,你找抽啊,還講不講了)
馬上開說,其實我只是想告訴你,所有你用的Windows下的程序,都是通過使用一個又一個的Windows API來執行相應工作的,沒有API,你的程序什麼也做不了。
用VB、Delphi以及MFC的朋友也許會說我根本沒有使用什麼API啊!其實這些API都是由你所用的開發環境自動進行相應的轉換的。比如說你用Delphi新增一程序,什麼也不用動就直接按F9來執行它,是不是出現一個空白的表單?這就是個標準的Windows程序,它有Windows程序所具有的一切特徵,如最大化按鈕、最小化按鈕、關閉按鈕…你可以通過滑鼠來移動它。
但是如果你想用VC++或MASM32來寫這樣一個程序,那麼你有兩種方法,在VC++中,你可以用MFC或直接使用API,而在MASM32中,你就只有直接使用API這一種方法。
所謂直接使用API,就是指所有的操作都通過最原始的API來完成。通過直接使用API來產生這樣一個程序,你必須要先註冊視窗類(除非您使用 Windows 預定義的視窗類,如 MessageBox 或 dialog box);然後產生視窗;然後在桌面顯示視窗(除非您不想立即顯示它); 然後重新整理視窗客戶區;
麻煩吧,如果你想真正的讓這個程序能正常地執行下來,還要再加入以下步驟:
1.你要得到您應用程式的關鍵句。
2.表單顯示後就進入無限的獲取視窗消息的循環。
3. 如果有消息到達,由負責該視窗的視窗回調函數處理。
4. 如果用戶關閉視窗,進行結束處理。
上面這此步驟,都需要使用相應的API來完成。比如說得到程序的關鍵句用GetModuleHandle註冊視窗類用RegisterClass或RegisterClassEx;註冊後,還要用CreateWindowEx函數來產生相應視窗,而後用ShowWindow來顯示它,之後還會用UpdateWindow 來更新客戶區等等等等。
這些還都不算呢,如果你真通過直接使用API去寫一個稍大一點兒的程序的話,你會發現那是一個多麼不令人愉快的事情。
上面說的這些,只不過是API中的一小小小小小小小小小小….部分,這才幾個,真正的API有成百上千個,包括對系統各個方面進行的操作。
沒有API,你的程序什麼也幹不了。比如說你的程序中有一個Edit控件,VB中應該叫做Text控件吧,你想將用戶輸入到裡面的訊息放到一個變數中去,那麼Delphi中可以用Str:=Edit1.text來實現。VB中應該是Str=Text1.Text;但是如果你用API,想要得到Edit輸入框裡的文本內容,就要使用GetDlgItemInt(Edit中輸入的值當做數值來用)GetDlgItemText、GetDlgItemTextA(Edit中輸入的值當做字元串來用)。
而上面我說的VB、Delphi得到編輯項中輸入的內容的方法,最終在編譯成可執行文件的時候,也會由編譯器自動對其進行相應的轉換。
你只要明白一件事就好了,那就是你所用的程序,無時無刻都在使用著系統中的各種各樣的API函數。
其實Windows中的API,就相當於當年DOS系統中的系統功能使用,及中斷21。只不過在數量上和功能上,都是DOS系統功能使用所不及的。
如果你還是看不明白,那我不怪你,可能是我講的不清楚,所以,還是給你推薦老牛寫的書吧。力推《Windows程序設計》,看過之後你會內力大增的,那時候你所知道的知識就不止是API而以了。
其實話說回來,我這篇文章不是教你編程的,所以關於Windows程序的原理,沒有必要說那麼多,我之所以跟你講API,是想讓你知道Windows程序的執行機制。免的到時候用偵錯器下斷點的時候問什麼是API。
(眾人(十分憤怒地)衝上台來:「拉下去PK!把我們當什麼了!」)
(我再次來到台上,鏡頭切向臉的一側,來個特寫。只見上面有若干處大小不同的傷口)可能還有些重點的地方我沒有提到,歡迎指正。
如果你有什麼不明白的地方,歡迎隨後貼帖提問。只要別太那個,比如說「你能把所有的API給我列出來讓我回去背背好嗎?」
附上幾個常用的API函數吧。
相信你此時因該以經對API有個大概的瞭解了。
MessageBox 顯示一訊息對話視窗
MessageBoxEx 顯示一訊息對話視窗
MessageBoxIndirect 顯示一設定訊息對話視窗
(以上這三個,可以用來中斷那些錯誤提示,比如說你註冊碼輸入錯誤了,程序就可能通過這幾個函數中的一個,來提示你錯誤)
GetDlgItemInt 得指定輸入框整數值
GetDlgItemText 得指定輸入框輸入字元串
GetDlgItemTextA 得指定輸入框輸入字元串
(軟體可以用這三個來得到用戶輸入的註冊碼)
GetLocalTime 得當前本機時間
GetSystemTime 得當前系統時間
(軟體可以用這兩個來判斷軟體是否過期)
RegQueryvalueA 獲取一個項的設定值
RegQueryvalueExA 獲取一個項的設定值
RegSetvalueA 設定指定項或子項的值
RegSetvalueExA 設定指定項的值
(如果軟體用註冊表儲存於註冊訊息的話,那麼這幾個也許會有用)
上面講的,只是幾個平時比較一般的,更多請參見看雪以前的教學或Windows開發人員手冊。
最後,我們還要隆重介紹一個重量級函數,你可能不知道API是什麼,但你只要用過偵錯器,就一定知道它的名字。你可以不知道美國現任的總統是誰,但是你一定要知道這個函數。
我雖然知道現任美國總統是鮑威爾 但我同時也知道這個函數是誰。
它就是----吳孟達!(導演:NG)重新說。它就是hmemcpy。
這個函數是幹什麼的?
它是一個非常簡單的函數。只完成一項非常非常基本的工作,就是把資料從一個地方複製到另一個地方。應用程式本身並不使用它,理由很簡單,它很低級(彙編:誰敢說跟我一樣?)。
但是大部分API函數卻非常頻繁地使用它。所以,它也叫萬能函數。
平時你可能都不知道有這麼個東西,但是斷起程序來卻非常管用。但目前到了2K跟Xp下,卻沒有這個函數了,與之相應的是一個叫memcpy的函數,雖然功能與其相同,但是基本上已經是個廢人了 總知,你用memcpy根本就斷不下什麼來。所以,這麼一個好使的函數只能在98下使用了。這就像美國的總統一樣,再好使也只能使八年,不好使的就別說了。
說不定明年就把他踢飛
別的我也不多說什麼了,這章你就知道API是什麼就成了。
如果你覺的有什麼不妥的地方或有什麼問題,並且想文明一點地表代出來的話,就請在回覆。如果想野蠻一點的話,就拿雞蛋往你顯示器上丟吧
|