Shgetfolderpath устарел: что является альтернативой для получения пути для папок Windows?
на SHGetFolderPath()
функция устарела, начиная с Windows Vista:http://msdn.microsoft.com/en-us/library/bb762181%28v=VS.85%29.aspx
какой альтернативный способ получить путь к папке приложения в Windows?
SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, szPath)
кроме того, почему я получаю эти ошибки при использовании этой функции:
Error 1 error C2065: 'CSIDL_COMMON_APPDATA' : undeclared identifier
Error 2 error C3861: 'SHGetFolderPath': identifier not found
4 ответов
альтернатива описана в документации, на которую вы ссылаетесь. А именно:SHGetKnownFolderPath
.
SHGetKnownFolderPath
доступно только в Vista или более поздней версии. Поэтому, если вы используете ссылку времени загрузки и запускаете программу, которая вызывает SHGetKnownFolderPath
на XP, тогда эта программа не запустится. Это явно проблема, если вы хотите поддерживать XP.
теперь вы можете переключиться на время выполнения ссылки SHGetKnownFolderPath
. Выполните проверку версии перед вызовом, и если функция недоступна, если SHGetFolderPath
.
SHGetFolderPath
существует в Windows 8, и я ожидал бы, что он все еще будет присутствовать в любой Windows, текущей через 10 лет. Мой совет-придерживаться привязки времени загрузки и переключаться только на SHGetKnownFolderPath
когда вы отказываетесь от поддержки XP.
ваш другой вопрос, который вы задаете в редактировании, - как позвонить SHGetFolderPath
. Вы должны соблюдать требования, которые изложены в нижней части раздела документации MSDN, на который вы ссылались в своем вопросе. В частности, включите Shlobj.h
и передать Shlobj.lib
компоновщику.
Он связан прямо вверху,SHGetKnownFolderPath.
CSIDL_COMMON_APPDATA заменяется FOLDERID_ProgramData в новом API.
я пробовал с помощью SHGetFolderPath()
С Visual Studio 2015 Enterprise на ПК с Windows 10, и он скомпилирован и отлично работал, чтобы найти домашнюю папку текущего пользователя. На странице Центра разработки Windows на SHGetFolderPath()
функция SHGetFolderPath есть следующее примечание:
Примечание начиная с Windows Vista, эта функция является просто оболочкой для
SHGetKnownFolderPath
. TheCSIDL
значение преобразуется в соответствующееKNOWNFOLDERID
а тоSHGetKnownFolderPath
is называемый. Новый приложения должны использовать известную систему папок, а не более старыеCSIDL
система, которая поддерживается только для обратной совместимости.
как указал Дэвид Хеффман в своем ответе, Microsoft имеет историю сохранения обратной совместимости в течение многих лет, особенно когда они могут взять старую функцию и просто перенаправить ее на новую функцию с соответствующими аргументами. The CSIDL
значения, похоже, имеют соответствующий KNOWNFOLDERID
значение. Видеть это таблица CSIDL
константы с краткими аннотациями и соответствующий KNOWNFOLDERID
значение.
ниже приведен пример использования функции. Это использование извлекает папку текущего пользователя (например, "C:\Users\myuser\Documents" под Windows 7), а затем добавляет имя папки в конец пути с помощью
я столкнулся с тем же набором ошибок, когда я добавил несколько новых файлов заголовков в мое уже рабочее решение.
Я уже звонил SHGetFolderPath
и также включил #include <ShlObj.h>
но он был в другом заголовочном файле. Решение компилировалось без каких-либо ошибок, прежде чем я добавил в него новые файлы заголовков библиотек.
Я попытался заменить SHGetFolderPath()
С SHGetKnownFolderPath()
но это просто перенаправил идентификатор не найден ошибка SHGetKnownFolderPath
.
добавить
#include <ShlObj.h>
в файл заголовка класса, называяSHGetFolderPath
, в ошибки прекратились, и решение снова было успешно скомпилировано.
как говорится в этой страница, называя SHGetFolderPath
в Windows Vista или более высокой ОС будет внутренне вызывать SHGetKnownFolderPath
.