我不确定StringCbPrintf和定义它的包含文件strsafe.h是否属于WinAPI。一方面,微软在其WinAPI站点上记录了该函数,而strsafe.h位于Windows SDK目录结构下,这表明(至少对我而言)它确实是WinAPI的一部分。另一方面,strsafe.h包括属于阴极射线管的stdio.h等。我一直认为WinAPI是完全独立于显像管的(但反之亦然)。可能,我对WinAPI和CRT之间关系的假设是错误的。因此我的问题是:StringCbPrintf是WinAPI的一部分吗?
发布于 2019-03-01 02:46:31
StrSafe应用程序接口有点奇怪,因为它没有自己的.DLL,也没有自己的导出函数。我假设它是以这种方式开发的,因为它需要支持已经发布的旧版本的Windows。它是在WinXP service pack安全推送期间创建的:
在2002年2月和3月期间,微软的所有应用程序开发都停止了,开发人员参与了安全推动计划。目标是检查所有代码中可能存在的安全漏洞,并修复这些问题。安全推送的One of the outcomes是一个名为"strsafe.lib“的安全字符串函数库,带有一个名为”strsafe.h“的相关标头。该库可通过Platform SDK获得,该平台SDK可从MSDN网站下载,并作为Visual C++.NET 2003的一部分自动安装。
据我所知,Michael Howard和David LeBlanc在Writing Secure Code (Second Edition)中也包含了一份strsafe.h的副本,但我不确定他们是否是原始作者(David LeBlanc是SafeInt的作者):
你可以在Secureco2\Strsafe文件夹的随附内容中找到一份Strsafe.h的副本。
msvcrt.dll现在基本上是一个系统文件,只有Windows95没有它。您不应该使用它作为您的C运行时,但微软的SDK代码可能会使用它没有问题。
Windows现在是一个“已知的动态链接库”,也就是说it is a system component是由
拥有并构建的。它仅供系统级组件将来使用。
如果你也想使用msvcrt.dll作为你的C运行时,那么你必须为StrSafe.h的Windows7使用use the WDK,但是当你使用StrSafe.h的内联版本时,只要你链接到一个包含所需的<=类型函数的.lib,那么它来自哪个vsnprintf应该并不重要。还有一个StrSafe.lib文件,但微软建议您使用内联版本。
您说得对,Windows API应该独立于CRT,但StrSafe也支持像StringCbGetsA这样的标准输入函数,并且他们没有选择将这些函数分离到单独的头中。再加上需要一个现有的 vsnprintf类型函数来完成实际工作,这意味着StrSafe在某种程度上附加到了CRT上,尽管它本应供所有WinAPI开发人员使用。
对于它是否是WinAPI的一部分,可能没有真正的答案,因为它有点主观。因为它包含在SDK的include文件夹中,所以人们可能会认为Microsoft认为它是SDK/API组件,而不是CRT组件。
发布于 2019-02-28 18:13:15
如果它不是在Windows中实现的,并且没有从它的DLL中导出(例如,从kernel32.dll中导出CreateFile()或CloseHandle() ),我会说它不是WinAPI的一部分,即使它最终调用了在Windows中实现的东西。
https://stackoverflow.com/questions/54922292
复制相似问题