【问题标题】:Is StringCbPrintf (strsafe.h) part of the WinAPI?StringCbPrintf (strsafe.h) 是 WinAPI 的一部分吗?
【发布时间】:2019-02-28 09:28:51
【问题描述】:

我不确定StringCbPrintf 和定义它的包含文件strsafe.h 是否属于WinAPI。一方面,微软在其 WinAPI 网站上记录了该功能,strsafe.h 位于 Windows SDK 目录结构下,这表明(至少对我而言)它确实是 WinAPI 的一部分。另一方面,strsafe.h 包括属于 CRT 的stdio.h 等。我一直认为 WinAPI 完全独立于 CRT(反之亦然)。可能,我对 WinAPI 和 CRT 之间关系的假设是错误的。因此我的问题是:StringCbPrintf 是 WinAPI 的一部分吗?

【问题讨论】:

    标签: windows winapi crt


    【解决方案1】:

    StrSafe API 有点奇怪,因为它没有自己的 .DLL,也没有自己的导出函数。我认为它是这样开发的,因为它需要支持已经发布的旧版本的 Windows。它是在 WinXP 服务包安全推送期间创建的:

    在 2002 年 2 月和 3 月期间,所有应用程序开发 微软停了下来,开发者参与了安全推动 倡议。目标是检查所有代码的安全性 漏洞并修复这些问题。 One of the outcomes 的 Security Push 是一个安全字符串函数库,称为 “strsafe.lib”与一个名为“strsafe.h”的关联头文件。这 库可通过可下载的 Platform SDK 获得 来自 MSDN 网站,并自动安装为 Visual C++.NET 2003。

    据我所知,Michael Howard 和 David LeBlanc 的Writing Secure Code (Second Edition) 还包含 strsafe.h 的副本,但我不确定他们是否是原作者(David LeBlanc 是 SafeInt 的作者) :

    您可以在随附内容中找到 Strsafe.h 的副本 文件夹 Secureco2\Strsafe。


    msvcrt.dll 现在基本上是一个系统文件,只有 Windows 95 没有它。您不应该将它用作您的 C 运行时,但来自 Microsoft 的 SDK 代码可能可以毫无问题地使用它。

    msvcrt.dll 现在是“已知 DLL”,这意味着 it is a system component 由 Windows 拥有和构建。它旨在为未来 仅由系统级组件使用。

    如果你也想使用 msvcrt.dll 作为你的 C 运行时,那么你必须 use the WDK for vsnprintf 类型函数,它来自哪个 CRT 并不重要。还有一个 StrSafe.lib 文件,但 Microsoft 建议您使用内联版本。


    您是正确的,Windows API 应该独立于 CRT,但 StrSafe 也支持像 StringCbGetsA 这样的标准输入函数,并且无论出于何种原因,他们都没有选择将它们分成单独的标头。再加上需要现有 vsnprintf 类型函数来完成实际工作,这意味着 StrSafe 在某种程度上与 CRT 相关联,尽管它旨在供所有 WinAPI 开发人员使用。

    它是否是 WinAPI 的一部分可能没有真正的答案,因为它有点主观。由于它包含在包含文件夹中的 SDK 中,因此会假定 Microsoft 认为它是 SDK/API 组件而不是 CRT 组件。

    【讨论】:

      【解决方案2】:

      如果它没有在 Windows 中实现并从它的一个 DLL 中导出(例如来自 kernel32.dll 的 CreateFile() 或 CloseHandle()),我会说它不是 WinAPI 的一部分,即使它最终调用了一些东西在 Windows 中实现。

      【讨论】:

      • 主要问题是 - 哪个 .dll 正在导出这些函数。
      • @montonero 据我所见,StringCbPrintf() 似乎是在 Strsafe.h 中定义的(不仅仅是声明的),而不是从 system32 目录中的任何 DLL 导出的。此功能的 MSDN 页面仅列出此头文件,而例如lstrcat() 列出了 Winbase.h 和 kernel32.dll。
      • @montonero - StringCbPrintf 是在 strsafe.h 中实现的内联函数。内部它最终调用从不同 dll 导出的_vsnwprintf
      • _vsnwprintf 不是从 WinAPI dll 导出的,这只会增加我的配置,因为我认为 StringCbPrintf 应该与 CRT 一起记录,并且它的头文件应该在 CRT 目录中找到/ies。
      • @RenéNyffenegger _vsnwprintf 是从几个不同的 dll 导出的。包括用户模式下的 msvcrt.dllntdll.dll。在内核模式下,它由 ntoskrnl.exe 导出。 winapi 的一部分与否 - 相关问题。
      猜你喜欢
      • 2019-07-04
      • 1970-01-01
      • 2011-08-19
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2021-04-21
      • 2016-10-08
      相关资源
      最近更新 更多