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 -
unsigned
8 位整数。 - DWORD - 32 位
unsigned
整数。 - LONG - 32 位有符号整数。
- LPDWORD - 32 位指向 DWORD 的指针。
- LPCSTR - 32 位指向常量字符字符串的指针。
- LPSTR - 32 位指向字符字符串的指针。
- UINT - 32 位
unsigned
int。 - WORD - 16 位
unsigned
int。 - 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