目錄
1.1 第一個實例程序.. 1
1.1.1 start.exe. 1
1.1.2 Windows API 2
1.1.3 程序入口函數.. 2
1.1.4 start.c 代碼分析.. 3
1.2 編譯代碼.. 4
1.2.1 安裝Visual Studio. 4
1.2.2 安裝Microsoft Platform SDK. 5
1.2.3 集成Microsoft Platform SDK與Visual C++ 速成版.. 7
1.2.4 Visual Studio 專業版或團隊系統版.. 8
1.2.5 使用圖形化IDE 建立工程、進行編譯.. 8
1.2.6 使用命令行工具編譯.. 9
1.2.7 注意事項.. 10
1.3 小結.. 11
1.1 第一個實例程序
1.1.1 start.exe
start.ext是本書的第一個實例,創建一個簡單的消息對話框。
圖1-1 第一個實例程序
實例1-1,實現代碼如下:
/* ************************************ *《精通Windows API》 * 示例代碼 * start.c * 1.1.1 第一個示例程序,彈出消息對話框 **************************************/ /* 預處理 */ /* 頭文件 */ #include <windows.h> //連接時使用User32.lib #pragma comment (lib, "User32.lib") /* ************************************ * WinMain * 功能 Windows應用程序示例 **************************************/ int WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // 調用API函數 MessageBox MessageBox(NULL, TEXT("開始學習Windows編程"), TEXT("消息對話框"), MB_OK); return 0; }
1.1.2 Windows API
所謂 API 是“Application Program Interface”的簡寫,中文含義為“應用程序接口”,它是一系列函數、宏、數據類型、數據結構的集合,運行於Windows系統的應用程序可以使用這些操作系統提供接口來完成應用程序需要的功能。
MessageBox函數是Windows眾多API中的一個,其功能是彈出一個對話框。
1.1.3 程序入口函數
WinMain 函數是程序入口點,相當於 C 語言的 main 函數,其定義如下:
int WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
WinMain 函數有 4 個參數:hInstance、hPrevInstance、lp CmdLine、nCmdShOW。
- 第一個參數是 hInstance,數據類型是 HINSTANCE,此參數表示應用程序本次運行實例的句柄。
- 第二個參數是 hPrevInstance,數據類型也是 HINSTANCE,表示應用程序之前運行的句柄,但是在實際應用中,此參數始終為 NULL。
- 第三個參數 lpCmdLine 是運行時參數。如在 cmd命令行中運行“start.ext Command Arguments”,那么lpCmdLine就指向字符串“Command Arguments”,作用與C語言中main函數的參數作用類似。數據類型LPSTR是Windows API常見的字符串類型。
- 最后一個參數是 nCmdShow,數據類型是int,表示應用程序窗口(如果有)的顯示狀態。WinMain 函數的返回類型是 int 型的。
1.1.4 start.c 代碼分析
預編譯聲明,在本實例中共有兩條預編譯聲明:
#include <windows.h>
在Windows應用程序開發中所使用的很多的數據類型、結構、API接口函數都在Windows.h。
#pragma comment (lib, "User32.lib")
這行代碼指明將源文件編譯生成目標文件(.obj)后,將目標文件鏈接成可執行文件的過程中需要使用到 User32.lib,因為 User32.lib 中包含了 MessageBox 的鏈接信息。如果在鏈接程序時,調用鏈接器的參數中指明了鏈接時需要使用到 user32.lib,這—句程序代碼可以省略(參見第3章)。
代碼接下來是 WinMain 函數的定義。在 WinMain 函數中調用了 MessageBox 函數。
// 調用API函數 MessageBox MessageBox(NULL, TEXT("開始學習Windows編程"), TEXT("消息對話框"), MB_OK);
MessageBox 函數的原型如下:
int MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType );
第一個參數 hWnd 是消息框所屬的窗口的句柄,可以設置為 NULL。
第二個參數 lpText 是字符串,表示消息框所顯示的消息。
第三個參數 lpCaption 是字符串,表示消息框的標題。
第四個參數 uType 是消息框的類型,在實例 1-1 中設置為“MB_OK”,意思是消息框包含一個“確定按鈕”MessageBox 函數調用之后,程序返回 O,結束 WinMain 函數,退出進程。
Minimum DLL Version |
user32.dll |
Header |
Declared in Winuser.h, include Windows.h |
Import library |
User32.lib |
Minimum operating systems |
Windows 95, Windows NT 3.1 |
Unicode |
Implemented as ANSI and Unicode versions. |
您可以自己參考表頭文件或 / Platform SDK / User Interface Services / Windowing / Dialog Boxes / Dialog Box Reference / Dialog Box Functions里的文件。
1.2 編譯代碼
SDK:Platform SDK for Windows XP SP2(每個版本都有Platform SDK for Windows7、Vista等,安裝大概45分鍾左右)
http://files.cnblogs.com/yongfeng/Microsoft_Platform_SDK.zip
工具:Visual C++ 2008 Express Edition(Visual C++速成版 or Visual C++ 2005 Express Edition)
1.2.1 安裝Visual Studio
Visual Studio 包括速成版、專業版和團隊系統版本(Visual Studio Team System)。速
成版是免費的版本,專業版和團隊系統版本是商業版。但是速成版的功能與專業
沒有太大的區別。
如果讀者使用 Visual C++速成版,需單獨安裝 Microsoft Platform SDK,並將其與
Visual Studio 集成在一起 ,才可以在本機進行 Windows 應用程序的開發。
Visual C++速成版的安裝步驟如下:
(1) 從微軟公司的站點上下載中文版的 Visual C++速成版,也可以從本書配套光盤中獲得。運行 vcsetup.exe。
(2) 單擊“下一步”按鈕。
在這一步,讀者需要選擇需要安裝的組件。推薦安裝圖形化的 IDE,IDE 將大大方便代碼的編輯、編譯等工作。不安裝圖形化 IDE,讀者也可以使用命令行工具來編譯程序。
(3) 在安裝的過程中,需要連接上 Internet。安裝程序將下載 Windows Installer 3.1、
NET Framework 和 Visual C++ 2005 速成版進行安裝。
安裝完成后,進行注冊就可以使用了。在 Visual Studio 安裝目錄下的 bin 文件夾中,讀者可以看到包括 cl.exe、nmake.exe、link.exe、lib.exe、rc.exe 等編譯和鏈接工具。
安裝了Visual C++速成版后僅僅可以進行標准C程序和C++程序的開發,但是還不能調用Windows API,無法完成一個 Windows 應用程序所需的大部分功能,因為缺少Platform SDK。
1.2.2 安裝Microsoft Platform SDK
安裝需要注意2點:
(1) 在一般情況下,選擇典型安裝可以滿足使用需要。這里需要進行一些設置,所以選擇“Customer”。
(2) 選擇“Configuration Options” →“Register Environment Variables”選項,並選擇完全安裝。如果不選擇此項,Visual Studio 工具將無法找到 SDK。
1.2.3 集成Microsoft Platform SDK與Visual C++ 速成版
在安裝完成后,還需要對 Visual C++速成版進行設置,使編譯鏈接工具可以找到 SDK。如果編譯鏈接工具找不到 SDK,那么在源代碼中的 API 調用將會產生編譯鏈接錯誤。
在 Visual C++速成版中進行如下操作。在菜單中選擇“工具”→“選項”,出現“選項”對話框,如圖 1-5 所示。
(1) 設置IDE環境
“選項”對話框選擇“項目和解決方案” →“VC++目錄”
單擊“新建”文件夾,選擇Platform SDK安裝目錄下的“Include”文件夾。
單擊“新建”文件夾,選擇Platform SDK安裝目錄下的“Lib”文件夾。
單擊“新建”文件夾,選擇Platform SDK安裝目錄下的“Bin”文件夾。
圖1-5 設置Visual Studio,集成Platform SDK
(2) 設置環境變量
如果安裝Platform SDK時沒有選擇“Configuration Options” →“Register Environment Variables”,或者選擇了“Typical”安裝模塊,那么還需要為系統添加環境變量。
MSSdk 變量:值為 SDK 安裝目錄。
Mstools 變量:值為 SDK 安裝目錄。
INETSDK 變量:值為 SDK 安裝目錄。
Bkoffice 變量:值為 SDK 安裝目錄。
Basemake 變量:值為%MSSdk%\Include\ BKOffice.Mak。
INCLUDE 變量:值為%MSSdk%\Include\。
LIB 變量:值為%MSSdk%\Lib\。
並在 Path 變量前加上%MSSdk%\Bin\;%MSSdk%\Bin\WinNT\。
Visual Studio 專業版不需要上述設置,但是也可以使用這種方法來更新 Visual Studio
所使用的 SDK 的版本。
1.2.4 Visual Studio 專業版或團隊系統版
如果讀者有 Visual Studio 專業版或團隊系統版,可直接進行安裝,專業版已經內嵌了
Platform SDK。在安裝完成后,不需配置就可使用。
1.2.5 使用圖形化IDE 建立工程、進行編譯
在完成安裝和設置后,本小節將以 Visual C++速成版為例說明如何編譯 1.1.1 節的程序。
- 打開 Visual C++速成版。
- 新建工程,在菜單中選擇“文件一新建工程”在新建工程對話框中的“Visual C++”類別下,選擇“空項目”,如圖 1-6 所示。
圖1-6 Visual Studio新建工程
- 輸入項目名稱,完成項目的建立。
- 在“解決方案裝源管理器”中,右鍵單擊工程名稱,選擇“添加一新建項”,在“添加新項”對話框中,選擇“代碼”,鍵入文件名稱“start”,文件后綴是“.c”或者是“.cpp” 都可以,如圖 1-7 所示。
圖1-7 為工程添加代碼文件
- 將實例 1-1 代碼復制到 start.c 中。
- 如果不需要調試,在工具欄(位於菜單欄下)中將“Debug”改為“Release”。
- 在菜單中選擇“生成一生成解決方案”(或使用快捷鍵,一般是 F7)。
- 如果編譯沒有報錯,則在程序目錄下會有“Debug”或” “Release”文件夾,可執行文件位於此。
1.2.6 使用命令行工具編譯
除了使用圖形化的 IDE 工具,還可以使用 nmake 工具對程序進行編譯和鏈接。nmake 是一個字符界面程序,通過 Makefile 配置。在使用 nmake工具時需要使用 Visual Studio的命令行。
將實例 1-1 中的代碼存為 start.c,然后將實例 1-2 的內容存為文件 makefile。
實例 1-2 編譯 sta rt.c 的 makefile ,本實例是一個 makefile 文件,可以用於編譯 start.c。編譯時需要使用到 nmake 工具,其代碼如下:
D:\TestDemo>nmake /f makefile Microsoft (R) Program Maintenance Utility Version 7.00.8882 Copyright (C) Microsoft Corp 1988-2000. All rights reserved. if not exist "START_BIN/" mkdir START_BIN cl -c -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl -nologo -GS -D_X86_=1 -DWIN32 - D_WIN32 -W3 -D_WINNT -D_WIN32_WINNT=0x0502 -D_WIN32_IE=0x0600 -DWINVER=0x0502 -D_MT -MTd /Gz /Fo"START_BIN\\" /Fd"START_BIN\\" start.c start.c link /INCREMENTAL:NO /NOLOGO -subsystem:windows,5.02 -out:START_BIN\sta rt.exe START_BIN\start.obj kernel32.lib ws2_32.lib mswsock.lib advapi32.lib buf feroverflowu.lib
1.2.7 注意事項
環境系統變量要包含3個關鍵路徑:
LIB→C:\Program Files\Microsoft Visual Studio 9.0\VC\include;C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include
INCLUDE→C:\Program Files\Microsoft Visual Studio 9.0\VC\lib;C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE;
PATH→C:\Program Files\Microsoft Visual Studio 9.0\VC\bin;
這里使用的是Windows Platform SDK運行,即如下圖:
若使用DOS窗口,則參考文章:
C++ WINDOWS API 如何使用NMAKE和CL編譯
http://www.cnblogs.com/yongfeng/archive/2013/04/26/3044434.html
1.3 小結
PDF下載:http://files.cnblogs.com/yongfeng/WINDOWSAPI01.rar
摘自:《精通Windows.API-函數、接口、編程實例》 人民郵電出版社
范文慶、周彬彬、安靖編著