小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

VB之API初學(xué)者教程第三章

 悟靜 2009-08-03

VB之API初學(xué)者教程第三章:Any、參數(shù)傳遞

來(lái)源:http://www./vb.asp?page=1&1

Any
有些消息的參數(shù)聲明為Any.這表示該參數(shù)是一種可變的類(lèi)型(你可以以整型,字符串,用戶(hù)自定義或其他的類(lèi)型來(lái)傳遞).
這有一個(gè)這樣的例子:
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)傳遞.
這里是在這個(gè)函數(shù)中如果lParam是不同類(lèi)型的值時(shí)應(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ù)聲明同上面的一個(gè)而且你想傳遞一個(gè)Long型數(shù),你應(yīng)該這樣寫(xiě):
Call SendMessage(Me.Hwnd,WM_XXXX,0&,ByVal LongValue)
注意盡管頭三個(gè)參數(shù)也是數(shù)值,但它們前邊并沒(méi)有ByVal.這是因?yàn)樵诤瘮?shù)聲明中它們已經(jīng)被聲明為按值傳遞(ByVal).第四個(gè)參數(shù),由于是按引用傳遞(ByRef)(VB并不知道你要傳遞參數(shù)的類(lèi)型),因此你必須加上ByVal 你可以使用別名技術(shù)來(lái)傳遞不同類(lèi)型的參數(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ù)類(lèi)型本身是不會(huì)改變的.例子中的第四個(gè)參數(shù)總是一個(gè)4字節(jié)的長(zhǎng)型數(shù).當(dāng)你按值(ByVal)傳遞一個(gè)Long或 Null時(shí),該4字節(jié)長(zhǎng)的數(shù)值就直接傳遞給函數(shù).如果你傳遞一個(gè)String或其他的什么,你是按引用(ByRef)傳遞,VB傳遞的實(shí)際上是變量的地址,也是4個(gè)字節(jié).

參數(shù)傳遞
你已經(jīng)知道如何傳遞參數(shù)了,只需把他放到調(diào)用的函數(shù)中即刻.然而,當(dāng)你使用API函數(shù)時(shí),在傳遞參數(shù)是有一些你應(yīng)該注意的 細(xì)節(jié). ByVal還是ByRef. 通常情況下,你不用為此擔(dān)心,VB的API瀏覽器已經(jīng)為你做好了一切,只需你輸入數(shù)值它就會(huì)照所聲明的方式傳遞.總的來(lái)說(shuō),ByVal是把實(shí)際的數(shù)值傳遞給函數(shù),而B(niǎo)yRef是把地址傳給函數(shù).唯一的麻煩就是 Any 類(lèi)型. 把字符串傳遞給API函數(shù)也并不難.API函數(shù)需要的是字符串首字符的地址,然后讀取該地址直到遇到一個(gè)Null字符.聽(tīng)起來(lái)很糟糕,但只是VB處理字符串的實(shí)際方法.你唯一要記住的是一定要按引用傳遞(ByRef)字符串 當(dāng)你想得到所需的函數(shù)返回值信息時(shí),情況有稍微的一點(diǎn)不同.
這里是GetComputerName函數(shù)的聲明:
Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA"(ByVal lpBuffer As String, nSize As Long) As Long
第一個(gè)參數(shù)是一個(gè)指向字符串的遠(yuǎn)程指針,第二個(gè)參數(shù)是字符串的長(zhǎng)度.
如果你只是簡(jiǎn)單的聲明一個(gè)字符串類(lèi)型的變量并把它傳遞給函數(shù),就會(huì)出現(xiàn)錯(cuò)誤.因此,你首先需要初始化字符串.這里是如何得到計(jì)算機(jī)名字的例子: Dim Buffer As String
Buffer = Space(255)
Ret& = GetComputerName(Buffer, Len(Buffer))
if Ret& > 0 then CompName$ = Left(Buffer, Ret&)
在這里,待傳遞的字符串被初始化為有255個(gè)空格的字符串.我們把它傳遞給函數(shù)同時(shí)還有它的長(zhǎng)度.如果出錯(cuò)則返回值為0.
CompName中將保存計(jì)算機(jī)名. 有些函數(shù)也需要傳遞數(shù)組,這里是一個(gè)例子:
Declare Function SetSysColors Lib "user32" Alias "SetSysColors" (ByVal nChanges As Long, lpSysColor As Long, lpColorValues As Long) As Long
最后兩個(gè)參數(shù)是Long型數(shù)組.為了傳遞數(shù)組,你只需傳遞它的第一個(gè)元素.下面是示例代碼:
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ū)⒏淖兯谢顒?dòng)和非活動(dòng)窗口的標(biāo)題欄背景和文本的顏色.
(搜集整理)
------------------------------------------------
(http://www.提示:作者未知,感謝作者寫(xiě)出這么好的文檔,特發(fā)布與大家共享,一起學(xué)習(xí)交流,有知道作者的朋友請(qǐng)給出作者地址,發(fā)布到評(píng)論中,核實(shí)后我們后把來(lái)源和作者姓名重新編排到文章中。)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀(guān)點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多