SHGetKnownFolderPath не был объявлен в этой области

Я изучаю Java-программирование уже около 7 месяцев и заинтересовался c ++. В настоящее время я тоже читаю книгу на С ++.

Я использую Eclipse C ++, так как я довольно хорошо знаком с Eclipse.

Я сделал около 6 проектов (маленьких) в C ++, и до сих пор все работало нормально.

Моя проблема в том, что я не могу заставить метод SHGetKnownFolderPath работать.
Полная строка красная, хотя я импортировал все, собрал ее, попытался запустить. Я проверил на интернет-сайтах, и я использовал тот же код, что и другие люди, но все еще не работает для меня.

Это говорит: функция SHGetKnownFolderPath не может быть решена

Я на компьютере с Windows 8 64 бит.
Вот код:
ОБНОВИТЬ

    #define WINVER 0x0600 // 0x06020000  0x06030000
#include <shlobj.h>
#include <windows.h>
#include <combaseapi.h>
#include <comutil.h> //for _bstr_t (used in the string conversion)
#include <knownfolders.h>
#include <winerror.h> //for HRESULT
#include <winnt.h>
#include <iostream>
#include <string>

using namespace std;

int main(){

LPWSTR wszPath = NULL;
HRESULT hr;

hr = SHGetKnownFolderPath(FOLDERID_Documents, 0, NULL, &wszPath);// THIS LINE IS COMPLETELY RED

if (SUCCEEDED(hr)){
_bstr_t bstrPath(wszPath);
std::string strPath((char*)bstrPath);
std::cout << strPath;
}

CoTaskMemFree(wszPath);

return 0;
}

Вот журнал:

     #pragma comment(lib, "comsuppw")
^
..\src\HelloWorld.cpp: In function 'int main()':
..\src\HelloWorld.cpp:21:64: error: 'SHGetKnownFolderPath' was not declared in this scope
hr = SHGetKnownFolderPath(FOLDERID_Documents, 0, NULL, &wszPath);

Есть маленькая стрелка, указывающая на последнюю скобку под &wszPath)

Что может быть не так?
Я буду благодарен за все ответы или подсказки, которые я мог получить.

-2

Решение

В Eclipse нет ничего плохого, он корректно обрабатывает вывод ошибок от компилятора.

Ничего плохого в компиляторе, он правильно жалуется на попытку использовать функцию без предшествующего объявления.

Официальная документация четко говорит вам, где взять эту декларацию:

введите описание изображения здесь

Поскольку для этой функции требуется Vista или более поздняя версия, вам также необходимо следовать инструкциям на Использование заголовков Windows для настройки совместимости с определенной версией Windows.

#define WINVER 0x0600
#include <windows.h>
#include <shlobj.h>

Как только вы исправите свои включения (не импортирует! C ++ не является Java.), Вы обнаружите, что возможность приведения не устраняет проблемы безопасности типов. Этот код ужасно сломан:

_bstr_t bstrPath(wszPath);
std::string strPath((char*)bstrPath);

Приведение строки UTF-16 к char* не получает строку ASCII. Вы можете использовать wcout который понимает UTF-16, или звоните WideCharToMultiByte чтобы получить строку ASCII, которая cout могу принять.

5

Другие решения

Проблема в том, что вы используете WINVERкогда вы должны использовать _WIN32_WINNT, WINVER в основном затрагивает только очень старые функции — вы, как правило, захотите определить их оба.

#define WINVER 0x0600
#define _WIN32_WINNT 0x0600
4

По вопросам рекламы [email protected]