聯(lián)系WeChat:i-xiaodi,交流,付費課程學習
簡單介紹Windows API:
Windows API(Application Programming Interface)是Microsoft Windows平臺的應用程序編程接口,其主要目的是讓應用程序開發(fā)人員可以調(diào)用操作系統(tǒng)提供的一組例程功能,而無須考慮其底層的源代碼實現(xiàn)及內(nèi)部工作機制。API函數(shù)是構筑整個Windows框架的基石,它基于Windows的操作系統(tǒng)核心,上層是所有的Windows應用程序。
簡單來說,這些API接口就是函數(shù),就像C語言調(diào)用的stdio.h中的函數(shù)一樣。只不過這些函數(shù)是微軟提供給我們的,也放在了對應的頭文件.h中,用到的時候包含相應的頭文件即可。
創(chuàng)建一個使用Windows API的程序:
?
?
添加源文件,然后編譯代碼,生成程序
代碼如下:
#include <Windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int
nCmdShow)
{
MessageBox(NULL, TEXT("Hello World!"), TEXT("Caption"), MB_OKCANCEL | MB_ICONINFORMATION | MB_DEFBUTTON2);
return 0;
}
彈出一個消息框,標題為Caption,內(nèi)容為Hello World!
?解釋:
1.Windows.h
頭文件,包含我們所用的一些函數(shù)的聲明,比如WinMain(入口函數(shù))、MessageBox(信息框)
2.WinMain函數(shù)
入口函數(shù),類似于C語言的main函數(shù),這個是Windows應用程序的入口函數(shù)
3.WINAPI
這個是函數(shù)的調(diào)用約定,只不過用宏進行了重新定義?
拓展:
CALLBACK、WINAPI、APIENTRY等都代表__stdcall,__stdcall是一種函數(shù)調(diào)用約定,也稱為標準調(diào)用約定。函數(shù)調(diào)用約定描述函數(shù)參數(shù)的傳遞方式和由誰來平衡堆棧,在程序中調(diào)用一個函數(shù)時,函數(shù)參數(shù)的傳遞是通過堆棧進行的,也就是說調(diào)用者把要傳遞給函數(shù)的參數(shù)壓入堆棧,函數(shù)在執(zhí)行過程中從堆棧中取出相應的參數(shù)使用。?
4.批注
程序生成成功后,會出現(xiàn)綠色波浪線,提示批注不一致
?我們轉(zhuǎn)到WinMain函數(shù)的聲明
我們可以看到微軟WinMain函數(shù)聲明的每個參數(shù)的數(shù)據(jù)類型前都有一個參數(shù)說明符:_In_、_In_opt_等,這些參數(shù)說明符稱為參數(shù)批注。
我們只需要把微軟正規(guī)的代碼抄過來,就可以了。
?關于批注:
參數(shù)批注用于說明函數(shù)參數(shù)的性質(zhì)和類型,可以幫助開發(fā)人員更好地了解如何使用這些參數(shù)。
與上面4個參數(shù)批注對應的還有_In_opt_、_Inout_opt_、_Out_opt_和_Outptr_opt_,opt表示可選擇(optional),表示可以不使用該參數(shù),也可以設置為0或者NULL(0),而表格中的4個不帶opt的參數(shù)批注表示該參數(shù)必須指定一個合理的值,也就是說,你必須得填。
在VS 2019以前,并不要求在函數(shù)聲明和定義中設置參數(shù)批注,參數(shù)批注僅用于指導程序員正確使用函數(shù)參數(shù)。為了正規(guī)一些,我們列出參數(shù)批注更好一些,以幫助大家正確使用函數(shù)參數(shù)。
5.WinMain函數(shù)參數(shù)解釋
一、_In_ HINSTANCE hInstance:
h是handle的首字母,表示當前應用程序的實例句柄,在Windows程序中句柄無非就是一個數(shù)值,程序中用它來標識某些對象,本次代碼中hInstance實例句柄就唯一地標識了正在運行中的exe程序文件。
內(nèi)存中的樣子(隨機基址)
固定基址(0x00400000)?
?拓展:
模塊:
模塊代表的是一個運行中的.exe或.dll文件,表示這個文件中的所有代碼和資源。磁盤上的文件不是模塊,載入內(nèi)存后運行時叫作模塊。另外,一個應用程序調(diào)用其他動態(tài)鏈接庫中的API時,這些.dll文件也會被載入內(nèi)存,這就產(chǎn)生了一些動態(tài)鏈接庫模塊。
因為有這么多的模塊,所以,為了區(qū)分地址空間中的不同模塊,每個模塊都有一個唯一的模塊句柄來標識。模塊句柄實際上就是一個內(nèi)存基地址,系統(tǒng)將.exe或.dll文件加載到地址空間的這個位置
實例:
實例的概念源于Win16,Win16系統(tǒng)中運行的不同程序的地址空間并非是完全隔離的。一個可執(zhí)行文件運行后形成模塊,多次加載同一個可執(zhí)行文件時,這個模塊是公用的。為了區(qū)分多次加載的“復制”,把每個“復制”叫作實例,每個實例均用不同的實例句柄(HINSTANCE)值來標識。
但在Win32中,每一個運行中的程序的地址空間是隔離的,每個實例都使用自己私有的4GB虛擬地址空間,不存在一個模塊具有多個實例的問題。即使同一程序同時運行了多個,它們之間通常也是互不影響的。在Win32中,實例句柄就是模塊句柄,但很多API函數(shù)中用到模塊句柄的時候使用的名稱還是實例句柄。
隨著歷史的發(fā)展與進步,很多詞語已經(jīng)不是他本來的含義,不過我們也能理解,這正是一種文化的延續(xù)。
二、_In_opt_ HINSTANCE hPrevInstance
表示應用程序上一個實例的句柄。在Win16中,當同時運行一個程序的多個副本時,同一程序的所有實例共享代碼以及只讀數(shù)據(jù)(例如菜單或?qū)υ捒蚰0逯惖馁Y源),一個程序可以通過査看hPrevInstance參數(shù)從而得知是否有它的其他實例在運行,這樣就可以把一些數(shù)據(jù)從前一個實例移到自己的數(shù)據(jù)區(qū)來。
對于Win32應用程序,該參數(shù)始終為NULL。這個是歷史殘留。
三、_In_ LPSTR lpCmdLine
指向應用程序命令行參數(shù)字符串的指針,不包括可執(zhí)行文件名。要獲取整個命令行,可以調(diào)用GetCommandLine函數(shù)。例如,在D盤下有一個111.txt文件,當我們用鼠標雙擊這個文件時將啟動記事本程序(notepad.exe),此時系統(tǒng)會將D:\111.txt作為命令行參數(shù)傳遞給記事本程序的WinMain函數(shù),記事本程序得到這個文件的路徑后,在窗口中顯示該文件的具體內(nèi)容。
拓展:
關于LPSTR,LPSTR是一種Windows數(shù)據(jù)類型
?_Null_terminated_表示以零結尾的字符串,LPSTR表示一個以零結尾的char類型字符串的指針。LPSTR中的LP是Long Pointer(長指針),這是Win16遺留的概念。在Win32中不區(qū)分長短指針,指針都是32位。以零結尾,有時候也稱為以空字符結尾、以NULL結尾等。
四、_In_ int nShowCmd文章來源:http://www.zghlxwxcb.cn/news/detail-810827.html
指定應用程序最初如何顯示,例如在任務欄上正常顯示、最大化到全屏顯示或最小化顯示。文章來源地址http://www.zghlxwxcb.cn/news/detail-810827.html
到了這里,關于Windows API編程01-詳解第一個程序(超級詳細)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!