Тот же вопрос от меня, и после дневного анализа всех статей, блога и stackoverflow я нашел простое решение. Не используйте savedInstanceState вообще, это условие с одной строкой кода. О коде фрагмента:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(null);
.....
Если он не реализован в Windows и не экспортирован из одной из его DLL (например, CreateFile () или CloseHandle () из kernel32.dll), я бы сказал, что он не является частью WinAPI, даже если он в конечном итоге вызывает вещи которые реализованы в Windows.
API-интерфейс StrSafe немного странный, поскольку у него нет ни собственного .DLL, ни собственных экспортируемых функций. Я предполагаю, что это было разработано таким образом, потому что это должно было поддержать более старые версии Windows, которые уже были выпущены. Он был создан во время принудительного пакета безопасности WinXP:
В феврале и марте 2002 года все разработки приложений в Microsoft были остановлены, и разработчики приняли участие в инициативе Security Push. Цель состояла в том, чтобы проверить весь код на наличие возможных уязвимостей и устранить эти проблемы. Одним из результатов Security Push стала библиотека безопасных строковых функций под названием «strsafe.lib» со связанным заголовком «strsafe.h». Эта библиотека доступна через Platform SDK, который можно загрузить с веб-сайта MSDN и автоматически устанавливается как часть Visual C ++. NET 2003.
blockquote>Насколько я могу судить, копия strsafe.h была также включена в Написание безопасного кода (второе издание) Майкла Ховарда и Дэвида Леблана, но я не уверен, что они являются первоначальными авторами (Дэвид Леблан является автором SafeInt):
Вы можете найти копию Strsafe.h в сопутствующем контенте в папке Secureco2 \ Strsafe.
blockquote>
msvcrt.dll в настоящее время является системным файлом, без него поставляется только Windows 95. Вы не должны использовать его в качестве среды выполнения C, но код SDK от Microsoft, вероятно, может использовать его без проблем.
msvcrt.dll теперь является «известной DLL», что означает, что это системный компонент , принадлежащий и созданный Windows. Он предназначен для будущего использования только компонентами системного уровня.
blockquote>Если вы хотите использовать 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.