VB動(dòng)態(tài)調(diào)用外部函數(shù)的方法
導(dǎo)讀:VB可以用Declare聲明來(lái)調(diào)用標(biāo)準(zhǔn)DLL的外部函數(shù),但是其局限性也很明顯:利用Declare我們只能載入在設(shè)計(jì)時(shí)通過(guò)Lib和Alias字句指定的函數(shù)指針!而不能在運(yùn)行時(shí)指定由我們自己動(dòng)態(tài)載入的函數(shù)指針),不能用Declare語(yǔ)句來(lái)調(diào)用任意的函數(shù)指針。當(dāng)我們想動(dòng)態(tài)調(diào)用外部函數(shù)的時(shí)候,就必須考慮采用其他的輔助方法,來(lái)完成這個(gè)任務(wù)了。
在文章《VB真是想不到系列之三:VB指針葵花寶典之函數(shù)指針 》、《Matthew Curland的VB函數(shù)指針調(diào)用》、《利用動(dòng)態(tài)創(chuàng)建自動(dòng)化接口實(shí)現(xiàn)VB的函數(shù)指針調(diào)用》等文獻(xiàn)中對(duì)此問(wèn)題都進(jìn)行了一定程度上的討論,但是頭緒都很繁瑣,對(duì)我這樣的菜鳥(niǎo)還有點(diǎn)深?yuàn)W,在資料搜索過(guò)程中,找到通過(guò)在VB中調(diào)入?yún)R編程序,比較簡(jiǎn)便的實(shí)現(xiàn)了這個(gè)功能,下面就是實(shí)現(xiàn)原理:
1)使用LoadLibrary加載DLL;
2)GetProcAddress獲得函數(shù)指針;
以上兩步得到了預(yù)加載函數(shù)的指針,但是VB中沒(méi)有提供使用這個(gè)指針的方法。我們可以通過(guò)一段匯編語(yǔ)言,來(lái)完成函數(shù)指針的調(diào)用!
3)通過(guò)匯編語(yǔ)言,把函數(shù)的所有參數(shù)壓入堆棧,然后用Call待用函數(shù)指針就可以了。
實(shí)現(xiàn)以上功能的主要程序:
′加載Dll
LibAddr = LoadLibrary(ByVal "user32")
′獲得函數(shù)指針
ProcAddr = GetProcAddress(LibAddr, ByVal "MessageBoxA")
′原型為MessageBox(hWnd, lpText, lpCaption, uType)
′---以下為Assembly部分---
push uType
push lpCaption
push lpText
push hWnd
call ProcAddr
′--------------------
FreeLibrary LibAddr′釋放空間
相關(guān)推薦:2010年9月計(jì)算機(jī)等級(jí)考試成績(jī)查詢(xún)時(shí)間匯總
2011計(jì)算機(jī)等級(jí)考試二級(jí)VB考點(diǎn)及習(xí)題匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |