2015-01-26 3 views
-2

Я изучаю Java-программирование около 7 месяцев, и меня заинтересовал C++. В настоящее время я читаю книгу на C++.SHGetKnownFolderPath не был объявлен в этой области

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

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

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

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

Я на окна 8 компьютеров 64 бит. Вот код: UPDATE

#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)

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

+0

В чем заключается определение вашей версии Windows?Возможно, вы пытаетесь создать приложение для версий старше Vista? У вас есть что-то связанное с макросами WINVER или _WIN32_WINNT в вашей настройке сборки? –

+0

Я просто добавил #define WINVER 0x0600. – Johan

+0

«Он говорит: Функция SHGetKnownFolderPath не может быть решена», и «SHGetKnownFolderPath» не был объявлен в этой области ». Какое из двух сообщений об ошибках верно? – jalf

ответ

5

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

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

The official documentation ясно говорит вам, где можно получить эту декларацию:

enter image description here

Поскольку эта функция требует Vista, или позже, вы также должны следовать инструкциям на Using the Windows Headers для установления совместимости с конкретной версией 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.

+0

Включил #include но неподвижная показывает ошибку – Johan

+0

@Johan: Что вы определили 'WINVER' to? В том же разделе документации говорится, что эта функция доступна в Vista, поэтому, если вы настроили совместимость с XP, она не будет найдена. –

+0

Я не определял WINVER, но я сделал это сейчас, построил проект и все тот же. – Johan

3

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

#define WINVER 0x0600 
#define _WIN32_WINNT 0x0600 
+0

У меня появилось новое сообщение об ошибке: 17:09:21 **** Инкрементное построение конфигурации Отладка для тестирования проекта **** Информация: Внутренний Builder используется для сборки g ++ -O0 -g3 -Wall -c -fmessage-length = 0 -o "src \\ HelloWorld.o" ".. \\ src \\ HelloWorld.cpp" g ++ "-LC: \\ Users \\ Johan \\ gcc \ \ x86_64-w64-mingw32 "-o testing.exe" src \\ HelloWorld.o "-lshell32.dll c:/users/johan/gcc/bin /../ lib/gcc/x86_64-w64-mingw32/4.9 .1 /../../../../ x86_64-w64-mingw32/bin/ld.exe: не удается найти -lshell32.dll collect2.exe: ошибка: ld возвращен 1 статус выхода 17:09 : 25 Build Finished (занял 3s.297ms) – Johan

+0

Это ошибка компоновщика. Вы, вероятно, хотите просто использовать '-lshell32', но вам нужно будет точно знать ваши библиотеки. –

+0

Должен ли я включать что-то в библиотеки в свойствах проекта или что? : P – Johan

 Смежные вопросы

  • Нет связанных вопросов^_^