c - 什么时候应该使用 Win32/WinAPI 类型与标准 C 类型?

标签 c windows winapi

Win32 派对我来晚了,这里有一大堆函数,例如 _tprintfTEXT(),还有像 strsafe.h 这样的库 具有 StringCchCopy()StringCchLength() 等函数。基本上,Win32 API 在 C 之上引入了一堆额外的函数和类型这可能会让不常使用 Win32 的 C 程序员感到困惑。 我在 MSDN 上找到这些类型和函数的定义没有问题。但是,我确实无法找到有关何时以及为何应使用它们的指南。

我有两个问题:

  1. 在使用 Win32 编程时,使用 Microsoft 在标准 C 之上提供的所有这些类型和特殊函数有多重要?取消所有标准 C 函数和类型并完全使用 Microsoft 包装器是否被认为是好的做法?

  2. 可以将标准 C 函数与这些 Microsoft 类型和函数混合使用吗?例如,使用 malloc() 而不是 HeapAlloc(),或者使用 printf() 而不是 _tprintf() 等等...?

我有一本 Charles Petzold 的 Programming Windows Fifth Edition 一书,但它主要涵盖了 GUI 的内容,而不是 API 的很多其余部分。

最佳答案

这里实际上有 3 个问题,一个是您明确提出的,另一个是您没有提出的。让我们先解决最后一个问题,因为它往往会引起最大的困惑:

Microsoft 提供的 CRT 提供的 _t 扩展是什么?

它们是 generic-text mappings , 引入是为了可以编写针对基于 ANSI 的系统 (Win9x) 和基于 Unicode 的系统 (Windows NT) 的代码。它们是基于 _UNICODE_MBCS 预处理器符号扩展为实际函数调用的宏。例如,符号 _tprintf扩展为 printfwprintf

同样,Windows API 提供 API 调用的 ANSI 和 Unicode 版本。它们也是扩展为实际 API 调用的预处理器宏,具体取决于预处理器符号 UNICODE。例如,CreateFile符号扩展为 CreateFileACreateFileW

在过去的二十年里,通用文本映射没有用处。现在,只需使用 Unicode 版本的 CRT 和 API 调用(例如 wprintfCreateFileW)。您也可以定义 _UNICODEUNICODE 以确保您不会不小心调用 ANSI 版本。

there are also libraries like strsafe.h which have such functions like StringCchCopy(), StringCchLength()

这些是 CRT 字符串操作调用的安全变体。它们比例如更安全strcpy 通过提供目标缓冲区大小,类似于 strncpy .然而,后者有一个尴尬的设计决定,导致目标缓冲区不以零终止,以防源不适合。 StringCchCopy 将始终以零终止目标缓冲区,从而为 CRT 实现提供额外的安全性。 (注意:C11 引入了安全变体,例如 strncpy_s,如果输入有效,它将始终以零终止目标数组。它们还验证输入,在验证失败时调用当前安装的约束处理程序,从而提供比 strsafe.h 实现更强大的安全性。边界检查实现是 conditional feature of C11。)

How important is it to use all of these types and special functions which Microsoft has provided on top of standard C when programming with Win32? Is it considered good practice to do away with all standard C functions and types and use entirely Microsoft wrappers?

一点都不重要。您可以使用更适合您的方案的任何一个。如果有疑问,通常最好编写可移植(即标准 C)代码。如果您需要 Windows API 调用提供的额外控制(例如,HeapAllocmalloc 允许更多的分配控制;同样 CreateFile 提供了比 fopen 更多的选项。

Is it okay to mix standard C functions in with these Microsoft types and functions? For example, to use malloc() instead of HeapAlloc(), or to use printf() instead of _tprintf() and etc...?

一般来说,是的,只要你匹配那些调用:HeapFreeHeapAllocfreemalloc。例如,您不能混合使用 HeapAllocfree。如果 Windows API 调用需要使用特殊的内存管理函数,文档中会明确指出。例如,如果 FormatMessage请求分配缓冲区以返回数据,必须使用 LocalFree 释放它。如果您不请求 API 分配缓冲区,您可以传入以任何您喜欢的方式分配的缓冲区(mallocHeapAllocIMalloc::Alloc 等)。

关于c - 什么时候应该使用 Win32/WinAPI 类型与标准 C 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48366780/

相关文章:

c++ - 我想重新运行一个线程

c++ - Visual Studio 中的 _ITERATOR_DEBUG_LEVEL 错误

winapi - 是否有相当于 nanosleep 的 Windows?

c# - HKEY 到 Microsoft.Win32.RegistryKey 的转换

windows - 如何在 Windows XP/Vista 上创建临时文件的路径

c - 阻止 SIGINT 终止程序

在C中转换输入数字字符串

c - C 中的 Accept() - 套接字编程

c - 获取 C 段错误 11

android - 如何在 Windows 10 上为 Sony Smartwatch 3 设置 ADB 的 USB 驱动程序