Ориентация на рабочий стол Windows 7: идентификатор SHGetKnownFolderPath не определен

Я пишу настольное приложение C++ для Windows 7 и более поздних версий.
Я хочу получить путь к папке AppData/Roaming, поэтому использую SHGetKnownFolderPath:

#include "stdafx.h"
#include <windows.h>
#include <ShlObj.h>

void hello()
{
    LPWSTR roamingPath;
    SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, NULL, &roamingPath);

ПРОБЛЕМА: сборка завершается ошибкой с identifier "SHGetKnownFolderPath" is undefined, что странно, поскольку я думаю, что включил правильные заголовки.


Примечания:

  • Visual Studio 2015 сообщает, что у меня есть параметры компиляции /Yu"stdafx.h" /GS /analyze- /W3 /Zc:wchar_t /ZI /Gm /Od /Fd"Debug\vc140.pdb" /Zc:inline /fp:precise /D "WIN32" /D "_WINDOWS" /D "_DEBUG" /D "_USRDLL" /D "_WINDLL" /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /Oy- /MDd /Fa"Debug\" /EHsc /nologo /Fo"Debug\" /Fp"Debug\OverlayIcon.pch".
  • Отличается от Ошибка: идентификатор: SHGetKnownFolderPath не идентифицирован, где проблема заключается в том, что Аскер нацелен не только на рабочий стол.

person Nicolas Raoul    schedule 08.03.2016    source источник
comment
Ваши макросы целевой платформы в заголовке stdafx.h, скорее всего, будут важны для этого вопроса, так как их значения указывают, какие функции выявляются при компиляции через заголовки. Возможно, вы захотите включить их в свой вопрос.   -  person WhozCraig    schedule 08.03.2016
comment
@WhozCraig: добавлено! Однако проблема с синтаксисом StackOverflow :-/   -  person Nicolas Raoul    schedule 08.03.2016
comment
В том виде, в котором он находится сейчас, после того, как вы обновили свой пост, он должен, по крайней мере, скомпилировать исходный код. Кстати, вы владеете этим заголовком stdafx.h в своем проекте. Нет большого смысла не просто менять значения на правильные цели прямо здесь, поскольку они в любом случае включены во все ваши единицы перевода.   -  person WhozCraig    schedule 08.03.2016


Ответы (1)


Хитрость заключается в том, чтобы добавить эти две строки в ваш файл stdafx.h:

#define WINVER 0x0601 // Allow use of features specific to Windows 7 or later.
#define _WIN32_WINNT 0x0601

Это говорит о том, что приложение нацелено на Windows 7, что важно, поскольку SHGetKnownFolderPath доступен только в Windows Vista, как указано в документация MSDN. У меня сразу не заработало, пришлось чистить и даже перезапускать Visual Studio.

Вот коды для всех остальных версий Windows:
https://msdn.microsoft.com/en-us/library/6sehtctf.aspx

Спасибо WhozCraig за подсказку!

person Nicolas Raoul    schedule 08.03.2016