Visual Basic以友好易學的可視化開發環境聞名於 世,成為人們學習電腦程式設計的首選語言。目前,全世界 大概有300多萬人使用著Visual Basic語言。如果您想在這茫茫眾生中出類拔萃,那麼您就不得不學習API (Application Program lnterface,即Windows的應用程 序程式設計接口)程式設計。不懂API,那可成不了高手。
API說到底就是一系列的底層函數,是系統提供給 用戶用於進入作業系統核心,進行高級程式設計的途徑。透過在Visual Basic應用程式中聲明外部過程就能夠 訪問Windows API(以及其它的外部DLLs)。在聲明了過程之後,調用它的方法與調用Visual Basic自己的過程相同。
Visual Basic (VB)作為一種高效程式設計環境,它封裝了部分Windows API函數,但也犧牲了一些API的功能。調用API時稍有不慎就可能導致API程式設計錯誤,出現難於捕穫或間歇性錯誤,甚至出現程式崩潰。要減少API程式設計錯誤,提高VB調用API時的安全性,應重點注意下列八個問題:
(1)指定“Option Explicit”
程式設計前最好將VB程式設計環境中的“Require Variable Declaration(要求變量申明)項選中。如果該項未被指定,任何簡單的錄入錯誤都可能會產生一個“Variant”變量,在調用API時,VB對該變量進行強制轉換以避免衝突,這樣一來,VB就會為字元串、長整數、整數、浮點數等各種類型傳遞NULL值,導致程式無法正常運行。
(2)注意VB整數和Win32整數的區別
在VB環境下,涉及到的所有integer(整型數),都是16位,而一旦涉及C/C++Win32文檔時,則是32位,閱讀與Windows API函數或與32位動態鏈接庫有關的資料或應用程式時,尤其要注意分析理解環境背景,以利於分清數據類型和數據結構,正確地聲明API函數。
(3)減少和避免使用As Any
雖然用As Any的方法聲明庫,可使Windows API函數能接受多種類型的參數,但更嚴重的是,即使是一個很小的錯誤,比如遺漏類型標識符或錯誤地使用了ByVal關鍵字,都可能導致系統崩潰或很難發現的其他數據錯誤。
(4)注意檢查參數類型
API錯誤中,除了因遺漏ByVal關鍵字導致的錯誤外,大約有50%是因為聲明中有不正確的參數類型。在Win32環境下,無論是8位、16位,還是32位數值變量都是以32位傳遞,如果同時使用,則很難發現其中錯誤。如果聲明的參數類型不同,被VB視為Variant傳遞給API函數,會出現“錯誤的DLL調用規范”的消息。
(5)勿忘ByVal,確保函數聲明的完整性
ByVal是“按值”調用,參數傳遞時,不將指向DLL的指針傳遞給參數變量本身,而是將傳遞參數值的一份拷貝傳遞給DLL。比如傳遞字元串參數時,VB與DLL之間的接口支援兩種類型的字元串,如未使用ByVal關鍵字,VB將指向DLL的函數指針傳遞給一個OLE2.0字元串(即BSTR數據類型),而Windows API函數往往不支援這種數據類型,導致錯誤。而使用ByVal關鍵字後VB將字元串轉變換成C語言格式的“空終止”串,被API正確使用。
(6)重新檢查函數名
在Win16環境下,API函數的名字不要求區分大小寫,而在Win32環境下,則有此要求。在一個DLL函數裏找不到聲明的函數時,有必要檢查一下函數名,對於管理字元串的函數,是否遺漏了A和W前綴。
(7)預先初始化字元串,以免造成衝突
如果API函數要求一個指向緩衝區的指針,以便從中載入數據,而此時傳遞的是字元串變量,應該先初始化字元串長度。因為API無法知道字元串的長度--API默認已為其分配有足夠的長度。沒有初始化字元串,分配給字元串的緩衝區有可能會不足,API函數將有可能在緩衝區末尾反覆改寫,記憶體裏字元串後面的內容將會改寫得一塌糊塗。程式錶現為突然終止或間歇性錯誤。
(8)跟蹤檢查參數、返回類型和返回值
VB具有立即模式和單步調試功能,利用這個優勢,確保函數聲明的類型明確(API不返回Variant類型),透過跟蹤和檢查參數的來源及類型,可以排除參數的錯誤傳遞。許多API函數都有返回結果,指出自己是否執行成功。你若要對返回結果進行測試,用VB的Err對象的LastDllError方法可查閱這些資訊,對錯誤可針對API函數調用,取回API函數GetlastError的結果,以修改聲明,達到正確調用API函數之目的。
文章定位: