在VB中呼叫Windows API的注意事項

2021-05-25 09:52:01 字數 1811 閱讀 9103

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函式之目的。

在VB中實現非同步呼叫

vb本身是不支援多執行緒的。但是vb中的部件有程序內及程序外的區分,因此這裡我使用程序外部件來實現非同步呼叫。伺服器端 新建乙個activeexe工程,加入乙個窗體,窗體中存放乙個timer控制項 新增乙個類模組。如下 private withevents m timer as timer publ...

在VB中實現非同步呼叫

vb本身是不支援多執行緒的。但是vb中的部件有程序內及程序外的區分,因此這裡我使用程序外部件來實現非同步呼叫。伺服器端 新建乙個activeexe工程,加入乙個窗體,窗體中存放乙個timer控制項 新增乙個類模組。如下 private withevents m timer as timer publ...

在vb,vc中呼叫vb編寫的DLL

假設用vb編寫了乙個activex 元件,名稱為bioxsend,裡面生成乙個類test,類裡面有乙個方法hello 並且已經在電腦上註冊,下面分別描述怎樣在vb和vc中呼叫。1.vb呼叫 1 方法1 直接在project reference裡引用該dll,然後在使用時宣告就可以了,如下 dim a...