C++ 程式設計/程式碼/API/Win32
Win32 API 是在 Windows 作業系統 中定義的一組函式,換句話說,它是 Windows API,這是 微軟 對在 應用程式程式設計介面 的核心集合的命名,可在 Microsoft Windows 作業系統 中使用。它設計用於 C/C++ 程式,是 軟體應用程式 與 Windows 系統互動的最直接方式。對 Windows 系統的更低級別訪問(主要用於 裝置驅動程式)由 Windows 驅動程式模型 在當前版本的 Windows 中提供。
可以透過使用 MSDN 庫(http://msdn.microsoft.com/)從 微軟 本身獲取有關 API 和支援的更多資訊,它實際上是用於使用 Microsoft 工具、產品和技術的開發人員的資源。它包含大量的技術程式設計資訊,包括示例程式碼、文件、技術文章和參考指南。您還可以檢視華夏公益教科書 Windows 程式設計 書籍以獲取超出本書範圍的一些更詳細的資訊。
Windows 提供了一個 軟體開發工具包 (SDK),它提供文件和工具,使開發人員能夠使用 Windows API 和相關的 Windows 技術建立軟體。(http://www.microsoft.com/downloads/)
- 歷史
Windows API 一直向程式設計師公開各個 Windows 系統的底層結構的很大一部分。這具有使 Windows 程式設計師能夠對其應用程式具有很大的靈活性和功能的優勢。但是,它也使 Windows 應用程式在處理與 圖形使用者介面 相關的各種低階,有時是繁瑣的操作方面負有很大責任。
查爾斯·佩措爾德(他寫過各種廣為人知的 Windows API 書籍)說:“Windows 1.0 SDK 中的原始 hello-world 程式有點醜聞。HELLO.C 大約 150 行,而 HELLO.RC 資源指令碼又多 20 行。 (...) 經驗豐富的 C 程式設計師在遇到 Windows hello-world 程式時,通常會驚恐或嘲笑。”。一個 hello world 程式 通常是一個常用的程式設計示例,通常設計用於顯示系統上可以實際執行某些操作的最簡單應用程式(即,列印一行文字“Hello World”)。
多年來,Windows 作業系統進行了各種更改和新增,Windows API 也隨之發生改變和發展。用於 Windows 1.0 的 windows API 支援少於 450 個 函式呼叫,而在現代版本的 Windows API 中有數千個。總的來說,介面保持相當一致,但是,一箇舊的 Windows 1.0 應用程式對習慣使用現代 Windows API 的程式設計師來說仍然看起來很熟悉。
微軟 在維護軟體 向後相容性 方面做出了很大努力。為了實現這一點,微軟有時甚至不惜支援以未公開或甚至(在程式設計上)非法的方式使用 API 的軟體。 雷蒙德·陳(一位在 Windows API 上工作的微軟開發人員)說,他“可能幾個月來只寫關於應用程式所做的糟糕的事情以及我們必須做些什麼才能讓它們再次工作(通常是自己做不到的)。這就是為什麼當人們指責微軟在作業系統升級期間惡意破壞應用程式時,我特別憤怒。如果任何應用程式無法在 Windows 95 上執行,我認為這是我個人的失敗。”
Win32 使用擴充套件的資料型別集,使用 C 的 typedef 機制,這些包括
- BYTE -
unsigned8 位整數。 - DWORD - 32 位
unsigned整數。 - LONG - 32 位有符號整數。
- LPDWORD - 32 位指向 DWORD 的指標。
- LPCSTR - 32 位指向常量字元字串的指標。
- LPSTR - 32 位指向字元字串的指標。
- UINT - 32 位
unsignedint。 - WORD - 16 位
unsignedint。 - HANDLE - 指向系統資料的非透明指標。
當然,使用 Win32 API 程式設計時,標準資料型別也可用。
在 Windows 中,庫程式碼以多種形式存在,並且可以透過多種方式訪問。
通常,唯一需要的是在原始碼上包含相應的標頭檔案中的資訊以告知編譯器,並且連結到 .lib 檔案將在連結階段發生。
此 .lib 檔案要麼包含要靜態連結到已編譯目的碼中的程式碼,要麼包含程式碼以允許訪問系統上的動態連結的二進位制庫 (.DLL)。
還可以在 C++ 中生成二進位制庫 .DLL,方法是在編譯和連結時包含適當的資訊,例如匯入/匯出表。
DLL 代表動態連結庫,它是某些程式中使用的函式的基本檔案。許多更新的 C++ IDE(例如 Dev-CPP)支援此類庫。
Windows 上的常見庫包括平臺軟體開發工具包、Microsoft Foundation Class 和 .Net Framework 程式集的 C++ 介面提供的庫。
雖然不嚴格用作庫程式碼,但平臺 SDK 和其他庫提供了一組標準化介面,用於透過 元件物件模型 訪問的物件,該模型作為 Windows 的一部分實現。
時間測量必須來自作業系統,與它執行的硬體有關。不幸的是,大多數計算機沒有標準的高精度、高精度的時鐘,而且訪問速度也很快。
MSDN 時間函式 ( http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/time_functions.asp )
計時器函式效能 ( http://developer.nvidia.com/object/timer_function_performance.html )
GetTickCount 的精度(取決於您的計時器滴答率)為 1 毫秒,其精度通常在 10-55 毫秒的預期誤差範圍內,最好的地方是它以恆定速率遞增。(WaitForSingleObject 使用相同的計時器)。
GetSystemTimeAsFileTime 的精度為 100 納秒,其精度與 GetTickCount 相似。
QueryPerformanceCounter 獲得速度可能較慢,但精度更高,使用 HAL(在 ACPI 的幫助下)。一個問題是,由於 LSB 上的垃圾,它可能會在超頻 PC 上倒退。請注意,除非提供的 LARGE_INTEGER 是 DWORD 對齊的,否則這些函式會失敗。
效能計數器值可能會意外向前跳躍 ( http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q274323& )
timeGetTime (透過 winmm.dll)的精度約為 5 毫秒。
MakeSureDirectoryPathExists (透過影像幫助庫 - IMAGHLP.DLL,#pragma comment( lib, "imagehlp.lib" ), #include <imagehlp.h>) 建立目錄,僅用於建立/強制給定目錄樹或多個目錄的存在,或者如果連結已經存在,請注意它是一個單執行緒的。
網路應用程式通常在 Windows 上使用 C++ 構建,利用 WinSock API 函式。
資原始檔可能是 WIN32 API 中最有用的元素之一,它們是我們程式設計選單、新增圖示、背景、音樂以及更多美觀元素的方式。遺憾的是,今天,使用資原始檔編譯的方法僅限於使用 MS Visual Studio IDE(資源編輯器、資源結構理解)的人員。
資源定義在 .rc 檔案(資源 c)中,並在編譯連結階段包含。資原始檔與標頭檔案(通常稱為 resource.h)配合使用,該標頭檔案包含每個 ID 的定義。
例如,一個簡單的 RC 檔案可能包含一個選單
//////////////
IDR_MYMENU MENU
BEGIN
POPUP "&File"
BEGIN
MENUITEM "&About", ID_FILE_ABOUT
MENUITEM "E&xit", ID_FILE_EXIT
END
POPUP "&Edit"
BEGIN
// Insert menu here :p
END
POPUP "&Links"
BEGIN
MENUITEM "&Visit Lukem_95's Website", ID_LINK_WEBSITE
MENUITEM "G&oogle.com", ID_LINK_GOOGLE
END
END
//////////////
相應的 H 檔案
#define IDR_MYMENU 9000 #define ID_FILE_EXIT 9001 #define ID_LINK_WEBSITE 9002 #define ID_LINK_GOOGLE 9003 #define ID_FILE_ABOUT 9004
