C++ WINDOWS API 第1章 Windows 应用程序开发入门
2013-04-28 03:22
夜雨瞳
阅读(14225)
评论(2)
编辑
收藏
举报
WinMain 函数有 4 个参数:hInstance、hPrevInstance、lp CmdLine、nCmdShOW。第一个参数是 hInstance,数据类型是 HINSTANCE,此参数表示应用程序本次运行实例的句柄。第二个参数是 hPrevInstance,数据类型也是 HINSTANCE,表示应用程序之前运行的句柄,但是在实际应用中,此参数始终为 NULL。第三个参数 lpCmdLine 是运行时参数。如在 cmd命令行中运行“start.ext Command Arguments”,那么第一个实例,创建一个简单的消息对话框
目录
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分钟左右)
https://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下载:https://files.cnblogs.com/yongfeng/WINDOWSAPI01.rar
摘自:《精通Windows.API-函数、接口、编程实例》 人民邮电出版社
范文庆、周彬彬、安靖编著
- 分类 专题C++
-
标签 C++
, WINDOWS API
, Microsoft Platform SDK
, Visual Studio
, Nmake
, CL