什么时候应该使用Win32/WinAPI类型而不是标准C类型?

the*_*ian 5 c windows winapi

我迟到对Win32党和有功能如海_tprintf,TEXT()外,还有库,例如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编程的Windows第五版书,但它主要涵盖了GUI的内容,而不是API的其余部分.

IIn*_*ble 6

这里实际上有3个问题,你明确要求的问题,以及你没有问过的问题.让我们先拿出最后一个,因为它往往会造成最大的混乱:

什么是那些_t通过微软提供的CRT提供-Extensions?

它们是通用文本映射,用于编写针对基于ANSI的系统(Win9x)以及基于Unicode的系统(Windows NT)的代码.它们是基于_UNICODE_MBCS预处理器符号扩展到实际函数调用的宏.例如,符号_tprintf扩展为printfwprintf.

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

通用文本映射在过去二十年中没有用处.今天,只需使用CRT和API调用的Unicode版本(例如wprintfCreateFileW).您也可以定义_UNICODEUNICODE进行良好测量,这样您就不会意外地调用ANSI版本.

还有像strsafe.h这样的函数库,如StringCchCopy(),StringCchLength()

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

在使用Win32编程时,使用Microsoft在标准C之上提供的所有这些类型和特殊功能有多重要?废除所有标准C函数和类型并完全使用Microsoft包装器被认为是一种好习惯吗?

它根本不重要.您可以在场景中使用更合适的选项.如果有疑问,通常优选编写便携式(即标准C)代码.您只需要调用Windows API调用,如果您需要它们提供的额外控制(例如,HeapAlloc允许更多地控制分配malloc;同样CreateFile提供更多选项fopen).

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

在一般情况下,是的,只要你符合这些来电:HeapFreeHeapAlloc,freemalloc.你不能混用HeapAllocfree,例如.如果Windows API调用需要使用特殊的内存管理函数,则在文档中明确指出.例如,如果请求FormatMessage分配缓冲区以返回数据,则必须使用它释放它LocalFree.如果你不要求API分配缓冲区,您可以在分配的缓冲区传递你喜欢的(任何方式malloc,HeapAlloc,IMalloc::Alloc等).