Является ли StringCbPrintf (strsafe.h) частью WinAPI?

Тот же вопрос от меня, и после дневного анализа всех статей, блога и stackoverflow я нашел простое решение. Не используйте savedInstanceState вообще, это условие с одной строкой кода. О коде фрагмента:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(null);
    .....
1
задан René Nyffenegger 28 February 2019 в 09:28
поделиться

2 ответа

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

0
ответ дан Alexey Frunze 28 February 2019 в 09:28
поделиться

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, который содержит требуемые функции типа vsnprintf, на самом деле не должно иметь значения, из какого CRT оно происходит. Существует также файл StrSafe.lib, но Microsoft рекомендует использовать встроенную версию.


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

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

0
ответ дан Anders 28 February 2019 в 09:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: