學習windows程式設計(7)不使用CRT庫的程式

2021-12-29 20:40:53 字數 2591 閱讀 8643

從前面幾篇,我們已經得到一些結論。

程式是可以自定義入口的,但是如果在入口中使用了一些crt相關的函式,而沒有正確的進行初始化工作的話,即使編譯不出問題,在執行時也會出現記憶體錯誤等問題的。

那我們可以寫出完全不用到crt庫的程式嗎?當然可以,既然crt庫也是微軟寫的,甚至我們可以用另外乙個crt庫來代替它。不過這個算是另外乙個話題了。先看看不使用crt庫的hello world是啥樣的吧。

不使用c執行時庫的測試**

view sourceprint?01 #include  

02   

03 dword stringlen(const char * str) 

04  

09   

10 void writestring(const char * str) 

11  

19   

20 int myentry(void) 

21

編譯:cl /c /zl myentrytest.c

鏈結:link /entry:myentry /subsystem:console myentrytest.obj kernel32.lib

最終得到可執行檔案myentrytest.exe。

執行效果與printf出來的效果相同,但是其中用到的原理卻是很不一樣的。

這裡,我們就接觸到了三個函式,這三個函式可以不通過crt庫直接使用,並且不造成任何問題,這三個函式都是所謂的windows api。這三個api都是kernel32提供的。通過直接呼叫windows api,可以使用到作業系統的功能,並成功繞過crt庫。儘管我們平時不太會使用到這樣的技巧,但是有時接觸到這樣的**或自己編碼時有這樣的要求,也是可能的。當然,要完全繞過crt庫,就需要提取出所編寫程式要使用到crt庫提供功能的所有函式,並使用windows api來同等代替,這樣花費的時間和重複做輪子也沒什麼兩樣,不過,如果要真的對系統有一定了解,還是有一定意義的。

這裡介紹一下windows api:

視窗作業系統應用程式介面(windows api),有非正式的簡稱法為winapi,是微軟對於windows作業系統中可用的核心應用程式程式設計介面的稱法。它被設計為各種語言的程式呼叫,也是應用軟體與windows系統最直接的互動方式。大多數驅動程式所需要的對windows系統的更底層次訪問介面,由所用版本的windows的native api來提供介面。

windows有乙個軟體開發包(sdk, software development kit)提供相應的文件和工具,以使程式設計師開發使用windows api的軟體和利用windows技術。

windows api所提供的功能可以歸為七類:[4]

基礎服務(base services)[5],提供對windows系統可用的基礎資源的訪問介面。比如象:檔案系統(file system)、外部裝置(device)、,行程(process)、執行緒(thread)以及訪問登錄檔(windows registry)和錯誤處理機制(error handling)。這些功能介面位於,16位元windows下的kernel.exe、krnl286.exe或krnl386.exe系統檔案中;以及32位元windows下的 kernel32.dll和advapi32.dll中。

圖形裝置介面(gdi)[6],提供功能為:輸出圖形內容到顯示器、印表機以及其他外部輸出裝置。它位於16位元windows下的gdi.exe;以及32位元windows下的gdi32.dll。

圖形化使用者介面(gui)[7],提供的功能有建立和管理螢幕和大多數基本控制項(control),比如按鈕和滾動條。接收滑鼠和鍵盤輸入,以及其他與gui有關的功能。這些呼叫介面位於:16位元windows下的user.exe,以及32位元windows下的user32.dll。從windows xp版本之後,基本控制項和通用對話方塊控制項(common control library)的呼叫介面放在comctl32.dll中。

通用對話方塊鏈結庫(common dialog box library)[8],為應用程式提供標準對話方塊,比如開啟/儲存檔案對話方塊、顏色對畫框和字型對話方塊等等。這個鏈結庫位於:16位元windows下的commdlg.dll中,以及32位元windows下comdlg32.dll中。它被歸類為user inte***ce api之下。

通用控制項鏈結庫(common control library)[9],為應用程式提供介面來訪問作業系統提供的一些高階控制項。比如像:狀態列(status bar)、進度條(progress bars)、工具欄(*******)和標籤(tab)。這個鏈結庫位於:16位元windows下的commctrl.dll中,以及32位元windows下comctl32.dll中。。它被歸類為user inte***ce api之下。

windows外殼(windows shell)[10][11],作為windows api的組成部分,不僅允許應用程式訪問作業系統shell提供的功能,還對之有所改進和增強。它位於16位元windows下的shell.dll中,以及32位元windows下的shell32.dll中(windows 95則在 shlwapi.dll中)。 它被歸類為user inte***ce api之下。

網路服務(network services)[12],為訪問作業系統提供的多種網路 功能提供介面。它包括netbios、winsock、netdde及rpc等。

Windows程式設計學習

1 基礎 windows 運作機制的核心是動態鏈結的概念,windows 提 用程式豐富的可呼叫函式,這些函式採用 dynamic linking library dll 的方式撰寫,是具有 dll 或.exe 為副檔名的檔案。早期的windows主要部分僅通過三個動態鏈結庫實現,分別為 kerne...

佇列陣列學習(不使用malloc)

在下這廂有禮了 平台 linux gcc編譯 描述 佇列陣列,不使用malloc分配空間,通過陣列分配空間去做佇列描述。結果如圖 queue.h檔案 定義結構體和佇列 ifndef zwqueue h included define zwqueue h included define bool in...

Windows使用技巧(以Windows7為例)

在命令框中輸入一長串命令,發現輸錯了,快速取消可以通過單擊 esc 鍵取消 同時按下 win 鍵 印有開始圖示的鍵 和 r 鍵可以開啟執行視窗,在這裡可以輸入你想執行的命令 開啟執行視窗後,在執行視窗中輸入 diskmgmt.msc 即可開啟磁碟管理器 右鍵 標記 用滑鼠選中需要複製的內容 回車,即...