當前位置:編程學習大全網 - 編程語言 - vb 的壹個簡單問題(對懂的人而言)好的話,再加分!

vb 的壹個簡單問題(對懂的人而言)好的話,再加分!

調用啊

呵呵

明白什麼叫api不?

什麼是API

首先,有必要向大家講壹講,什麼是API。所謂API本來是為C和C++程式師寫的。API說來說去,就是壹種函數,他們包含在壹個附加名為DLL的動態連接庫檔中。用標準的定義來講,API就是Windows的32位元應用程式編程介面,是壹系列很復雜的函數,消息和結構,它使編程人員可以用不同類型的編程語言編制出的運行在Windows95和Windows NT作業系統上的應用程式。可以說,如果妳曾經學過VC,那麼API對妳來說不是什麼問題。但是如果妳沒有學過VC,或者妳對Windows95的結構體系不熟悉,那麼可以說,學習API將是壹件很辛苦的事情。

如果妳打開WINDOWS的SYSTEM檔夾,妳可以發現其中有很多附加名為DLL的檔。壹個DLL中包含的API函數並不只是壹個,數十個,甚至是數百個。我們能都掌握它嘛?回答是否定的∶不可能掌握。但實際上,我們真的沒必要都掌握,只要重點掌握Windos系統本身自帶的API函數就可以了。但,在其中還應當拋開掉同VB本身自有的函數重復的函數。如,VB

的etAttr命令可以獲得檔屬性,SetAttr可以設置檔屬性。對API來講也有對應的函數

GetFileAttributes和SetFileAttributes,性能都差不多。如此地壹算,剩下來的也就5、600個。是的,也不少。但,我可以敢跟妳說,只要妳熟悉地掌握100個,那麼妳的編程水準比現在高出至少要兩倍。盡管人們說VB和WINDOWS具有密切的關系,但我認為,API更接近

WINDOWS。如果妳學會了API,首要的收獲便是對WINDOWS體系結構的認識。這個收獲是來自不易的。

如果妳不依靠API會怎麼樣?我可以跟妳說,絕大多是高級編程書本(當然這不是書的名程叫高級而高級的,而是在壹開始的《本書內容》中指明《本書的閱讀物件是具有壹定VB基礎的讀者》的那些書),首先提的問題壹般大都是從API開始。因此可以說,妳不學API,妳大概將停留在初級水準,無法往上攀登。唯壹的途徑也許就是向別人求救∶我快死了,快來救救我呀,這個怎麼辦,那個怎麼辦?煩不煩呢?當然,現在網上好人太多(包括我在內,嘻嘻),但,妳應當明白,通過此途徑,妳的手中出不了好的作品。這是因為缺乏這些知識妳的腦子雷根本行不成壹種總體的設計構思。

API文本遊覽器 [返回]

很多API函數都是很長很長的。想看什麼樣子嗎?如下就是作為例子的API DdeClientTransaction函數∶

Declare Function DdeClientTransaction Lib "user32" (pData As Byte, ByVal cbData As Long, ByVal hConv As Long, ByVal hszItem As Long, ByVal wFmt As Long, ByVal wType As Long, ByVal dwTimeout As Long, pdwResult As Long) As Long

哇!這麼長?如果妳從來沒有接觸過API,我想妳肯定被嚇住了。妳也許考慮,該不該繼續學下去。不過不要擔心,幸運的是Microsoft的設計家們為我們提供了有用的工具,這便是API

文本查看器。

通過API文本查看器,我們可以方便地查找程式所需要的函數聲明、結構類型和常數,然後將它復制到剪貼板,最後再粘貼到VB程式的代碼段中。在大多數情況下,只要我們確定了程式所需要的函數、結構和常數這三個方面後,就可以通過對API文本遊覽器的以上操作將他們加入到程式段中,從而程式中可以使用這些函數了。這些是學習API最基本的常識問題,它遠遠占不到API的龐大的體系內容。今後我們把精力浪費(這絕不是浪費)在哪裏呢?那就是∶

什麼時候使用什麼函數,什麼時候使用什麼結構類型,什麼時候使用什麼常數。

API函數聲明

讓我們回想壹下。在VB中,如何聲明函數呢?我想,如果妳正在看此文,那麼妳絕對能夠回答得出這個問題。以下便是妳應該很熟悉的函數聲明∶

Function SetFocus (ByVal hwnd As Long) As Long

即,這行代碼定義了名為SetFocus的函數,此函數具有壹個Long型資料類型的參數,並按值傳遞(ByVal),函數執行後將返回壹個Long型資料。

API函數的聲明也很類似,如,API中的SetFocus 函數是這樣寫的∶

Declare Function SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long

有點復雜了壹些。是的,是復雜了點。但我可以告訴妳,除了這些多出來的部分,其他部分還是和妳以前學到的東西是壹樣的。函數在程式中的調用也是壹樣。如:

Dim dl As Long

dl&=SetFoucs(Form1.Hwnd)

但,壹點是清楚的。它不象妳自己寫的程式那樣能夠看到裏面的運行機理,也不像VB

自帶的函數那樣,能夠從VB的聯機幫助中查到其用法。唯壹的方法就是去學、查VB以外的資料。

Declare 語句用於在模組級別中聲明對動態連結程式庫 (DLL) 中外部過程的引用。對此,妳只要記住任何API函數聲明都必須寫這個語句就可以了。

Iib 指明包含所聲明過程或函數的動態連結程式庫或代碼資源。也就是說,它說明的是,函數或過程從何而來的問題。

如在上例中,SetFocus Lib "user32"說明 函數 SetFocus 來自 user32.dll文件。主要的dll動態連接庫檔有∶

user32.dll Windows管理。生成和管理應用程式的用戶介面。

GDI32.dll 圖形設備介面。產生Windows設備的圖形輸出

Kernel32.dll 系統服務。訪問作業系統的電腦資源。

註意,當DLL檔不在Windows或System檔夾中的時候,必須在函數中說明其出處(

路徑)。如,SetFocus Lib "c:\Mydll\user32"

函數聲明中的Alias 是可選的。表示將被調用的過程在動態連結程式庫 (DLL) 中還有另外的名稱(別名)。如,Alias "SetFocus" ,說明SetFocus函數在User32.dll中的另外壹個名稱是,

SetFocus。怎麼兩個名都壹樣呢?當然,也可以是不同的。在很多情況下,Alias說明的函數名,即別名最後壹個字元經常是字元A,如SetWindowsText函數的另壹個名稱是

SetWindowsTextA,表示為Alias "SetWindowsTextA"。這個A只不過是設計家們的習慣的命名約定,表示函數屬於ANSI版本。

那麼,別名究竟有什麼用途呢?從理論上講,別名提供了用另壹個名子調用API的函數方法。如果妳指明了別名,那麼 盡管我們按Declare語句後面的函數來調用該函數,但在函數的實際調用上是以別名作為首要選擇的。如,以下兩個函數(Function,ABCD)聲明都是有效的,他們調用的是同壹個 SetFocus函數∶

Declare Function SetFocus Lib "user32" "SetFocus" (ByVal hwnd As Long) As Long

Declare ABCD SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long

需要註意的是,選用Alias的時候,應註意別名的大小寫;如果不選用Alias 時的時候,函數名必須註意大小寫,而且不能改動。當然,在很多情況下,由於函數聲明是直接從API

文本遊覽器中拷貝過來的,所以這種錯誤的發生機會是很少的,但您有必要知道這壹點。

最後提醒妳壹句,API聲明(包括結構、常數)必須放在表單或模組的"通用(General Declarations)段。

資料類型與"類型安全"

API函數中使用的資料類型基本上和VB中的壹樣。但作為WIN32的API函數中,不存在Integer

資料類型。另外壹點是在API函數中看不到Boolean資料類型。 Variant資料類型在API函數中是以Any的形式出現,如Data As Any。盡管其含義是允許任意參數類型作為壹個該API函數的參數傳遞,但這樣做存在壹定的缺點。其原因是,這將會使得對目標參數的所有類型檢查都會被關閉。這自然會給各種類型的參數調用帶來了產生錯誤的機會。

為了強制執行嚴格的類型檢查,並避免上面提到的問題,壹個辦法是在函數裏使用上面提到到Alias技術。如對API函數 GetDIBits 可進行另外壹種聲明方法。如下∶

GetDIBits函數的原型∶

Public Declare Function GetDIBits Lib "gdi32" Alias "GetDIBits" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long

GetDIBits函數的改型∶

Public Declare Function GetDIBitsLong Lib "gdi32" Alias "GetDIBits" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Long, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long

通過本課程前面所學到的知識,我們已經可以得知原型 GetDIBits函數也好,改型 GetDIBitsLong函數也好,實際將調用的都是Alias所指定的 GetDIBits原函數。但妳應當看到,兩者的區別在於,我們在改型的函數中強制指定lpBits參數為Long形。這樣就會使得函數調用中發生的錯誤機率減少到了最小。這種方法叫做"安全類型"聲明。

  • 上一篇:Java是什麽?和C語言有什麽區別?
  • 下一篇:內蒙古能源職業學院的專業設置
  • copyright 2024編程學習大全網