我迟到对Win32党和有功能如海_tprintf
,TEXT()
外,还有库,例如strsafe.h
其中有这样的功能,如StringCchCopy()
,StringCchLength()
等.基本上,Win32 API中引入了大量额外的功能和类型上的C其顶部可能会让一个没有使用Win32的C程序员感到困惑.我在MSDN上找到这些类型和函数的定义没有问题.但是,我确实在查找何时以及为何应该使用这些指南时遇到问题.
我有两个问题:
在使用Win32编程时,使用Microsoft在标准C之上提供的所有这些类型和特殊功能有多重要?废除所有标准C函数和类型并完全使用Microsoft包装器被认为是一种好习惯吗?
是否可以将标准C函数与这些Microsoft类型和函数混合使用?例如,使用malloc()
代替HeapAlloc()
,或使用printf()
而不是_tprintf()
等...?
我有一份Charles Petzold编程的Windows第五版书,但它主要涵盖了GUI的内容,而不是API的其余部分.
这里实际上有3个问题,你明确要求的问题,以及你没有问过的问题.让我们先拿出最后一个,因为它往往会造成最大的混乱:
什么是那些_t
通过微软提供的CRT提供-Extensions?
它们是通用文本映射,用于编写针对基于ANSI的系统(Win9x)以及基于Unicode的系统(Windows NT)的代码.它们是基于_UNICODE
和_MBCS
预处理器符号扩展到实际函数调用的宏.例如,符号_tprintf
扩展为printf
或wprintf
.
同样,Windows API提供API调用的ANSI和Unicode版本.它们也是预处理器宏,它们扩展到实际的API调用,具体取决于预处理器符号UNICODE
.例如,CreateFile
符号扩展为CreateFileA
或CreateFileW
.
通用文本映射在过去二十年中没有用处.今天,只需使用CRT和API调用的Unicode版本(例如wprintf
和CreateFileW
).您也可以定义_UNICODE
并UNICODE
进行良好测量,这样您就不会意外地调用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()
等...?
在一般情况下,是的,只要你符合这些来电:HeapFree
你HeapAlloc
,free
你malloc
.你不能混用HeapAlloc
和free
,例如.如果Windows API调用需要使用特殊的内存管理函数,则在文档中明确指出.例如,如果请求FormatMessage分配缓冲区以返回数据,则必须使用它释放它LocalFree
.如果你不要求API分配缓冲区,您可以在分配的缓冲区传递你喜欢的(任何方式malloc
,HeapAlloc
,IMalloc::Alloc
等).
归档时间: |
|
查看次数: |
792 次 |
最近记录: |