Является ли StringCbPrintf (strsafe.h) частью WinAPI? - PullRequest
0 голосов
/ 28 февраля 2019

Я не уверен, что StringCbPrintf и включаемый файл strsafe.h, где он определен, принадлежат WinAPI.С одной стороны, Microsoft документирует функцию на своих сайтах WinAPI, и strsafe.h находится в структуре каталогов Windows SDK, что указывает (по крайней мере, мне), что она действительно является частью WinAPI.С другой стороны, strsafe.h включает stdio.h и т. Д., Которые принадлежат ЭЛТ.У меня всегда было впечатление, что WinAPI полностью независим от CRT (но не наоборот).Возможно, мое предположение об отношениях между WinAPI и CRT неверно.Таким образом, мой вопрос: является ли StringCbPrintf частью WinAPI?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

API-интерфейс StrSafe немного странный, поскольку у него нет ни собственного .DLL, ни собственных экспортируемых функций.Я предполагаю, что это было разработано таким образом, потому что это должно было поддержать более старые версии Windows, которые уже были выпущены.Он был создан во время принудительного пакета безопасности WinXP:

В течение февраля и марта 2002 года все разработки приложений в Microsoft были остановлены, и разработчики приняли участие в инициативе Security Push.Цель состояла в том, чтобы проверить весь код на наличие возможных уязвимостей и устранить эти проблемы. Одним из результатов Security Push стала библиотека безопасных строковых функций под названием «strsafe.lib» со связанным заголовком «strsafe.h».Эта библиотека доступна через Platform SDK, который можно загрузить с веб-сайта MSDN и автоматически устанавливается как часть Visual C ++. NET 2003.

Насколько я могу судить, копия strsafe.h также был включен в Написание безопасного кода (второе издание) Майклом Ховардом и Дэвидом Лебланком, но я не уверен, что они являются первоначальными авторами (Дэвид Лебланк является автором SafeInt):

Вы можете найти копию Strsafe.h в сопутствующем содержимом в папке Secureco2 \ Strsafe.


msvcrt.dll в настоящее время является системным файлом, толькоWindows 95 поставляется без него.Вы не должны использовать его в качестве среды выполнения C, но код SDK от Microsoft, вероятно, может использовать его без проблем.

msvcrt.dll теперь является «известной DLL», что означает, что это системный компонент , принадлежащий и созданный Windows.Он предназначен для будущего использования только компонентами системного уровня.

Если вы хотите использовать msvcrt.dll в качестве среды выполнения C, то вы должны использовать WDK для <= Windows 7, но при использовании встроенной версии StrSafe.h, если вы ссылаетесь на файл .lib, который содержит требуемые функции типа <code>vsnprintf, на самом деле не должно иметь значения, из какого CRT он исходит.Существует также файл StrSafe.lib, но Microsoft рекомендует использовать встроенную версию.


Вы правы в том, что Windows API должен быть независимым от CRT, но StrSafe также поддерживает функции stdin, такие как StringCbGetsA и по какой-то причине они не решили разделять их в отдельный заголовок.Это в сочетании с необходимостью использования существующей функции типа vsnprintf для выполнения реальной работы означает, что StrSafe в некоторой степени привязан к CRT, даже если он предназначен для использования всеми разработчиками WinAPI.

Вероятно, нет верного ответа на вопрос, является ли он частью WinAPI или нет, поскольку он немного субъективен.Поскольку он включен в SDK в папке include, можно предположить, что Microsoft считает, что это компонент SDK / API, а не компонент CRT.

0 голосов
/ 28 февраля 2019

Если это не реализовано в Windows и не экспортировано из одной из его DLL (например, CreateFile () или CloseHandle () из kernel32.dll), я бы сказал, что это не часть WinAPI, даже если он в конечном итоге вызывает вещикоторые реализованы в Windows.

...