?應(yīng)用程序接口API是什么
接口是一個(gè)抽象概念,一般有好幾種層面的接口。Interface可翻譯為界面也可翻譯為接口,翻譯為接口的由來應(yīng)該是從電器的插口而來(未做考證)。通俗說法:接口就是用來連接而開放的入口。大致有這些類型的接口:硬件接口、用戶界面(UI)、軟件接口、面向?qū)ο蠼涌凇?/p>
至于API一般僅僅限于應(yīng)用程序的編程接口。通俗的解釋應(yīng)該是:一個(gè)組件(或程序庫)提供給開發(fā)者進(jìn)行編程使用的,通過代碼可以與之溝通的入口。比如說你下載了一個(gè)控件包,通過閱讀說明你知道應(yīng)該如何創(chuàng)建上下文、初始化、設(shè)置屬性、調(diào)用、回調(diào)、事件處理,這些就是這個(gè)控件包的API。
API一般對應(yīng)函數(shù),在面向?qū)ο箢I(lǐng)域可能對應(yīng)類提供的特性,而對于傳輸協(xié)議一般指協(xié)議的一種實(shí)現(xiàn)所提供的使用該協(xié)議的方式。
返回值? ?方法名(參數(shù)1, 參數(shù)2 。。。) 這就可以認(rèn)為是接口。
應(yīng)用程序接口為:“‘計(jì)算機(jī)操作系統(tǒng)(Operating system)’或‘程序庫’提供給應(yīng)用程序調(diào)用使用的代碼”。其主要目的是讓應(yīng)用程序開發(fā)人員得以調(diào)用一組例程功能,而無須考慮其底層的源代碼為何、或理解其內(nèi)部工作機(jī)制的細(xì)節(jié)。API本身是抽象的,它僅定義了一個(gè)接口,而不涉入應(yīng)用程序如何實(shí)現(xiàn)的細(xì)節(jié)。例如,圖形庫中的一組API定義了繪制指針的方式,可于圖形輸出設(shè)備上顯示指針。當(dāng)應(yīng)用程序需要指針功能時(shí),可在引用、編譯時(shí)鏈接到這組API,而運(yùn)行時(shí)就會調(diào)用此API的實(shí)現(xiàn)(庫)來顯示指針。
應(yīng)用程序接口API,就是軟件系統(tǒng)不同組成部分銜接的約定。由于近年來軟件的規(guī)模日益龐大,常常需要把復(fù)雜的系統(tǒng)劃分成小的組成部分,編程接口的設(shè)計(jì)十分重要。程序設(shè)計(jì)的實(shí)踐中,編程接口的設(shè)計(jì)首先要使軟件系統(tǒng)的職責(zé)得到合理劃分。良好的接口設(shè)計(jì)可以降低系統(tǒng)各部分的相互依賴,提高組成單元的內(nèi)聚性,降低組成單元間的耦合程度,從而提高系統(tǒng)的維護(hù)性和擴(kuò)展性。應(yīng)用程序接口是一組數(shù)量上千、極其復(fù)雜的函數(shù)和副程序,可讓程序員做很多任務(wù)作,譬如“讀取文件”、“顯示菜單”、“在視窗中顯示網(wǎng)頁”等等。操作系統(tǒng)的API可用來分配存儲器或讀取文件。許多系統(tǒng)應(yīng)用程序借由API接口來實(shí)現(xiàn),像是圖形系統(tǒng)、數(shù)據(jù)庫、網(wǎng)絡(luò)Web服務(wù),甚至是在線游戲。應(yīng)用程序接口有諸多不同設(shè)計(jì)。用于快速執(zhí)行的接口通常包括函數(shù)、常量、變量與數(shù)據(jù)結(jié)構(gòu)。也有其它方式,如通過解釋器,或是提供抽象層以屏蔽同API實(shí)現(xiàn)相關(guān)的信息,確保使用API的代碼無需更改而適應(yīng)實(shí)現(xiàn)變化。
應(yīng)用程序接口經(jīng)常是軟件開發(fā)工具包(SDK)的一部分
API又分為(Windows、Linux、Unix等系統(tǒng)的)系統(tǒng)級API,及非操作系統(tǒng)級的自定義API。作為一種有效的代碼封裝模式,微軟Windows的API開發(fā)模式已經(jīng)為許多商業(yè)應(yīng)用開發(fā)的公司所借鑒,并開發(fā)出某些商業(yè)應(yīng)用系統(tǒng)的API函數(shù)予以發(fā)布,方便第三方進(jìn)行功能擴(kuò)展。如Google、蘋果電腦公司,以及諾基亞等手機(jī)開發(fā)的API等等。
#e#
關(guān)于API使用
網(wǎng)上有很多API教程,但是都是針對單個(gè)API的使用來講解,但是如果遇到網(wǎng)上沒有教程的API呢?如下教程的目的就是這樣:當(dāng)遇到一個(gè)不會的API的時(shí)候,懂得如何利用資料學(xué)會使用這個(gè)API。
本文讀者需具備的知識:
1、VB的基本語法
2、API、結(jié)構(gòu)體、常數(shù)
3、VB的數(shù)據(jù)類型,C語言的簡單數(shù)據(jù)類型
4、API Viewer 2004(或其他同類軟件)的基本使用
5、一定的英文閱讀能力
那么要調(diào)用一個(gè)陌生的API,基本上遵循以下步驟
1、找到相關(guān)API、結(jié)構(gòu)體、常數(shù)的聲明
2、到MSDN閱讀這個(gè)API的網(wǎng)頁指南
3、按照MSDN寫代碼
實(shí)戰(zhàn)演示:
這次實(shí)戰(zhàn)的目標(biāo)是:GetOpenFileName
首先介紹一下這個(gè)API吧,這個(gè)API會顯示一個(gè)打開對話框,給用戶選擇一個(gè)文件打開
這個(gè)跟CommonDialog里面的打開對話框是一樣的(那干嘛不直接用那個(gè)控件?教程用來做演示嘛,而且用API也有他的好處)
第一步:找到聲明
找聲明主要有兩種方法
第一種是通過軟件找,例如API Viewer 2004,這類軟件內(nèi)置有絕大部分常用的聲明,直接復(fù)制即可,方便快捷
第二種是去MSDN找到API的頁面,然后復(fù)制聲明。MSDN是微軟的網(wǎng)站,聲明肯定是準(zhǔn)確的,但是對于VB開發(fā)者的劣勢是,絕大部分聲明都是按照C語言的格式的(至今沒見過一個(gè)API的頁面有VB聲明),所以如果不懂C語言的話要轉(zhuǎn)換成VB的聲明難度就大了
還有其他方法,例如dump dll文件之類的
本文主要討論第一種方法,使用的軟件是API Viewer 2004,其他同類軟件操作大同小異
打開API Viewer 2004,打開Win32api.apv文件,然后選擇Declarations一欄,然后選擇Subs and Functions,在文本框輸入GetOpenFileName,然后就找到這個(gè)API的聲明了,復(fù)制下來,扔進(jìn)VB的代碼里面
好了,現(xiàn)在來仔細(xì)看一下這個(gè)聲明:
Private Declare Function GetOpenFileName Lib “comdlg32.dll” Alias “GetOpenFileNameA” (ByRef pOpenfilename As OPENFILENAME) As Long
可以看到這里有一個(gè)陌生的參數(shù)類型OPENFILENAME,這明顯不是VB的基本數(shù)據(jù)類型,所以我們需要這個(gè)OPENFILENAME的聲明
于是回到API Viewer 2004,選擇Types一欄,在文本框輸入OPENFILENAME,找到聲明了,復(fù)制下來,扔到VB代碼里面
Private Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
繼續(xù)仔細(xì)看這個(gè)結(jié)構(gòu)體的聲明,可以發(fā)現(xiàn)成員都是VB的基本數(shù)據(jù)類型,說明不需要在找其他聲明了
第二步:閱讀MSDN對于這個(gè)API的解釋 & 第三步:按照MSDN寫代碼
這里說的MSDN不是按F1出來那個(gè)MSDN,而是MSDN網(wǎng)站msdn.microsoft.com。這個(gè)是微軟的官方開發(fā)者網(wǎng)站,里面資料齊全絕對是開發(fā)者的天堂
網(wǎng)站有中文版本和英文版本,不過強(qiáng)烈建議大家看英文版本,中文版的翻譯質(zhì)量不好(這就是為什么要求有一定的英文閱讀能力)
好吧進(jìn)入了這個(gè)官網(wǎng)之后,在最上面的Bing搜索里面打GetOpenFileName,然后搜索
出來的結(jié)果,一般選擇xxxx function這種頁面,這里選的就是第一個(gè)結(jié)果GetOpenFileName function
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646927(v=vs.85).aspx
頁面打開了,可以看到這個(gè)頁面分成幾大節(jié):
開頭:對API的簡單介紹
Syntax:語法,也就是API的聲明
Return Value:返回值
Remarks:一些附加的說明
Examples:示例代碼,一般都是用C語言寫的
Requirements:API對系統(tǒng)的要求等等
See Also:與此相關(guān)的API等
Community Additions:其他人對此文章的評論
網(wǎng)頁左欄:是整個(gè)站點(diǎn)的分類目錄
好吧,英文不好的同學(xué)要加油了,混國外網(wǎng)站英文是必須要會的
不要覺得一個(gè)API能有這么多內(nèi)容,很多信息都是很有用很關(guān)鍵的,耐心從上往下一節(jié)一節(jié)讀完
開頭:這個(gè)自己看就是了,對API的介紹和描述,不是很重要的部分(不過有時(shí)會有很重要的批注,例如此API不再被微軟支持建議用xxx代替之類的)
Syntax:這個(gè)就是API的語法,也就是聲明啦,C語言的,所以對我們沒什么用,可以跳掉不看
如果要根據(jù)這個(gè)C語言的聲明自己寫出VB的聲明,還是需要一定的C語言數(shù)據(jù)類型的知識
PS:這里為什么返回值是BOOL,但是我們的聲明是Long呢?是不是應(yīng)該把我們的VB聲明改成Boolean?不需要的。BOOL在C里面的定義就是long型(unsigned long?具體忘了,差不多這類東西),占用4字節(jié),所以應(yīng)該對應(yīng)VB的Long型。當(dāng)然,你閑著蛋疼也可以把返回值聲明成Single型,同樣也是4字節(jié),不過沒什么意義
Parameters:API的參數(shù)部分啦,整個(gè)網(wǎng)頁最重要的部分之一
按照這里的解釋,填寫參數(shù)就可以調(diào)用API了
好吧這里只有一個(gè)參數(shù),網(wǎng)頁寫的是
lpofn [in, out]
Type: LPOPENFILENAME
這個(gè)[in, out]是什么意思呢?in表示這個(gè)是個(gè)輸入?yún)?shù),這個(gè)參數(shù)的值會作為輸入對API的結(jié)果進(jìn)行影響。out表示這個(gè)同時(shí)也是個(gè)輸出參數(shù),API會把部分?jǐn)?shù)據(jù)返回到這個(gè)參數(shù)里面。(除了in和out,有些還會出現(xiàn)optional,表示這是個(gè)可選參數(shù))
LPOPENFILENAME說的就是參數(shù)的類型,等等,我們的聲明不是寫的類型是OPENFILENAME嗎,怎么這里多了個(gè)LP?這個(gè)是C語言里指針的意思(long pointer?),意思是當(dāng)調(diào)用API的時(shí)候,不是把這個(gè)整個(gè)OPENFILENAME結(jié)構(gòu)體的數(shù)據(jù)傳過去,而是只把這個(gè)結(jié)構(gòu)體的指針傳過去。同樣的寫法還有xxx*,例如OPENFILENAME*
接下來看他對這個(gè)參數(shù)的描述,大致是這個(gè)參數(shù)裝載著啟動這個(gè)API的參數(shù),當(dāng)API返回的時(shí)候會把結(jié)果放到這個(gè)結(jié)構(gòu)體里面
說的基本都是廢話,這個(gè)結(jié)構(gòu)體有這么多成員,我們還是不知道怎么填,那么就點(diǎn)進(jìn)去這個(gè)OPENFILENAME的鏈接
點(diǎn)進(jìn)去之后,發(fā)現(xiàn)這個(gè)OPENFILENAME文章結(jié)構(gòu)也差不多
Syntax可以跳過,我們已經(jīng)從API Viewer 2004里面找到聲明了(PS:后面這個(gè)#if和#endif中間的是什么東西呢?這個(gè)是C的預(yù)編譯指令,具體可以自己去看,在這里沒什么用)
Members,終于在講解這些成員的意思了,好吧可以開始寫代碼了,首先在VB里面寫
Dim ofn As OPENFILENAME
With ofn
End With
那么接下來就一個(gè)一個(gè)看成員,看他的解釋,是什么意思,應(yīng)該怎么填
需要注意的一些東西是,不像API的參數(shù),并沒有告訴你每個(gè)成員是作為輸入還是輸出的作用,需要自己認(rèn)真讀解釋
lStructSize,Type: DWORD
結(jié)構(gòu)體的字節(jié)大小,用sizeof(OPENFILENAME)獲得
sizeof其實(shí)就是C語言里面獲得結(jié)構(gòu)體大小的函數(shù),那VB里面我們就用LenB吧(Len也行,不過按照MSDN的說法還是用LenB吧)
(PS:DWORD對應(yīng)VB的Long)
代碼:.lStructSize = LenB(ofn)
hwndOwner,Type: HWND
這個(gè)對話框的父窗體的句柄,可以設(shè)置成NULL
那我們就做成父窗體是我們的Form1吧
(PS:HWND也是對于VB的Long,NULL則是0)
代碼:.hwndOwner = Me.hWnd
hInstance,Type: HINSTANCE
如果要指定對話框的模板,那么這個(gè)需要填上模板所在的程序句柄
我們沒興趣用什么模板,windows自帶的那個(gè)已經(jīng)夠好看了,不理他填個(gè)NULL
代碼:.hInstance = 0
lpstrFilter,Type: LPCTSTR
文件類型過濾器,格式為 描述文字
電子發(fā)燒友App
