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 исчезнуть в ближайшее время. Вы найдете это 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. The CSIDL значение преобразуется в соответствующее 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.