VB之API初學(xué)者教程第三章:Any、參數(shù)傳遞
來源:http://www./vb.asp?page=1&1
Any
有些消息的參數(shù)聲明為Any.這表示該參數(shù)是一種可變的類型(你可以以整型,字符串,用戶自定義或其他的類型來傳遞).
這有一個這樣的例子:
Public Declare Function SendMessage Lib "User32" Alias "SendMessageA" ByVal Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, lParam as Any) as Long
lParam 聲明為Any并按引用(ByRef)傳遞.
這里是在這個函數(shù)中如果lParam是不同類型的值時應(yīng)遵循的規(guī)則:
如果該值是 傳遞形式
numeric ByVal(as Long,or as Any)
Null ByVal(as Long,or as Any)
String ByRef(as String,or as Any)
Type ByRef(as Any)
array of Type ByRef(as Any)
如果你的函數(shù)聲明同上面的一個而且你想傳遞一個Long型數(shù),你應(yīng)該這樣寫:
Call SendMessage(Me.Hwnd,WM_XXXX,0&,ByVal LongValue)
注意盡管頭三個參數(shù)也是數(shù)值,但它們前邊并沒有ByVal.這是因為在函數(shù)聲明中它們已經(jīng)被聲明為按值傳遞(ByVal).第四個參數(shù),由于是按引用傳遞(ByRef)(VB并不知道你要傳遞參數(shù)的類型),因此你必須加上ByVal 你可以使用別名技術(shù)來傳遞不同類型的參數(shù):
Public Declare Function SendMessageLng Lib "User32" Alias "SendMessageA"(ByVal Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, ByVal lParam as Long) as Long
或:
Public Declare Function SendMessageStr Lib "User32" Alias "SendMessageA"(ByVal Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, lParam as String) as Long
注意API參數(shù)類型本身是不會改變的.例子中的第四個參數(shù)總是一個4字節(jié)的長型數(shù).當(dāng)你按值(ByVal)傳遞一個Long或 Null時,該4字節(jié)長的數(shù)值就直接傳遞給函數(shù).如果你傳遞一個String或其他的什么,你是按引用(ByRef)傳遞,VB傳遞的實際上是變量的地址,也是4個字節(jié).
參數(shù)傳遞
你已經(jīng)知道如何傳遞參數(shù)了,只需把他放到調(diào)用的函數(shù)中即刻.然而,當(dāng)你使用API函數(shù)時,在傳遞參數(shù)是有一些你應(yīng)該注意的 細節(jié). ByVal還是ByRef. 通常情況下,你不用為此擔(dān)心,VB的API瀏覽器已經(jīng)為你做好了一切,只需你輸入數(shù)值它就會照所聲明的方式傳遞.總的來說,ByVal是把實際的數(shù)值傳遞給函數(shù),而ByRef是把地址傳給函數(shù).唯一的麻煩就是 Any 類型. 把字符串傳遞給API函數(shù)也并不難.API函數(shù)需要的是字符串首字符的地址,然后讀取該地址直到遇到一個Null字符.聽起來很糟糕,但只是VB處理字符串的實際方法.你唯一要記住的是一定要按引用傳遞(ByRef)字符串 當(dāng)你想得到所需的函數(shù)返回值信息時,情況有稍微的一點不同.
這里是GetComputerName函數(shù)的聲明:
Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA"(ByVal lpBuffer As String, nSize As Long) As Long
第一個參數(shù)是一個指向字符串的遠程指針,第二個參數(shù)是字符串的長度.
如果你只是簡單的聲明一個字符串類型的變量并把它傳遞給函數(shù),就會出現(xiàn)錯誤.因此,你首先需要初始化字符串.這里是如何得到計算機名字的例子: Dim Buffer As String
Buffer = Space(255)
Ret& = GetComputerName(Buffer, Len(Buffer))
if Ret& > 0 then CompName$ = Left(Buffer, Ret&)
在這里,待傳遞的字符串被初始化為有255個空格的字符串.我們把它傳遞給函數(shù)同時還有它的長度.如果出錯則返回值為0.
CompName中將保存計算機名. 有些函數(shù)也需要傳遞數(shù)組,這里是一個例子:
Declare Function SetSysColors Lib "user32" Alias "SetSysColors" (ByVal nChanges As Long, lpSysColor As Long, lpColorValues As Long) As Long
最后兩個參數(shù)是Long型數(shù)組.為了傳遞數(shù)組,你只需傳遞它的第一個元素.下面是示例代碼:
Const COLOR_ACTIVECAPTION = 2
Const COLOR_INACTIVECAPTION = 3
Const COLOR_CAPTIONTEXT = 9
Const COLOR_INACTIVECAPTIONTEXT = 19
Dim SysColor(3) As Long
Dim ColorValues(3) As Long
Dim Ret& SysColor(0) = COLOR_ACTIVECAPTION
SysColor(1) = COLOR_INACTIVECAPTION
SysColor(2) = COLOR_CAPTIONTEXT
SysColor(3) = COLOR_INACTIVECAPTIONTEXT
ColorValues(0) = RGB(58, 158, 58) ’深綠
ColorValues(1) = RGB(93, 193, 93) ’淺綠
ColorValues(2) = 0 ’黑色
ColorValues(3) = RGB(126, 126, 126) ’灰色
Ret& = SetSysColors(4&, SysColor(0), ColorValues(0))
該程序?qū)⒏淖兯谢顒雍头腔顒哟翱诘臉祟}欄背景和文本的顏色.
(搜集整理)
------------------------------------------------
(http://www.提示:作者未知,感謝作者寫出這么好的文檔,特發(fā)布與大家共享,一起學(xué)習(xí)交流,有知道作者的朋友請給出作者地址,發(fā)布到評論中,核實后我們后把來源和作者姓名重新編排到文章中。)