2015-01-26 5 views
-2

저는 약 7 개월 동안 Java 프로그래밍을 공부해 왔으며 C++에 관심을 갖게되었습니다. 나는 현재 C++ 책을 읽고있다.SHGetKnownFolderPath가이 범위에서 선언되지 않았습니다.

이클립스 C++을 사용하고 있습니다. 일식에 익숙하기 때문에.

저는 C++로 6 개의 프로젝트 (작은 것들)를 만들었고 모든 것이 지금까지 잘되었습니다.

내 문제는 작동하도록 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

입니까?어쩌면, 당신은 비스타보다 오래된 버전을위한 앱을 만들려고하고 있습니까? 빌드 설정에서 WINVER 또는 _WIN32_WINNT 매크로와 관련된 것이 있습니까? –

+0

방금 ​​#define WINVER 0x0600을 추가했습니다. – Johan

+0

"다음과 같습니다 : SHGetKnownFolderPath 함수를 확인할 수 없습니다."및 " 'SHGetKnownFolderPath'이 (가)이 범위에서 선언되지 않았습니다." 두 가지 오류 메시지 중 올바른 것은 무엇입니까? – jalf

답변

5

Eclipse에 아무런 문제가 없으며 컴파일러의 오류 출력을 올바르게 처리하고 있습니다. 컴파일러 문제

아무것도, 올바르게 선행 선언하지 않고 기능을 사용하려는 시도에 대해 불평하지 않습니다. 이 기능은 비스타 이상이 필요합니다, 당신은 또한 특정 Windows 버전과의 호환성을 설정 Using the Windows Headers의 지침을 따라야합니다 때문에

enter image description here

:

The official documentation은 명확하게 선언을 구할 수있는 곳을 알려줍니다 .

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

당신이 포함 해결되면 (안 수입! C++ 자바하지 않습니다.) 당신이 입력 한 다음 안전 문제가 멀리 이동하지 않습니다 캐스팅 할 수있는 능력을 가지고 있음을 발견 할 것이다. 이 코드는 끔찍하게 분류됩니다

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

당신에게 ASCII 문자열을하지 않는 char*에 UTF-16 문자열을 주조. UTF-16을 인식하는 wcout을 사용하거나 WideCharToMultiByte을 호출하여 cout이 받아 들일 수있는 ASCII 문자열을 얻을 수 있습니다.

+0

#include 을 포함하지만 스틸은 오류를 표시합니다. – Johan

+0

@Johan : WINVER를 정의한 대상은 무엇입니까? 동일한 문서 섹션에서는 Vista에서이 기능을 사용할 수 있다는 것을 알려줍니다. 따라서 XP와의 호환성을 구성한 경우에는 찾을 수 없습니다. –

+0

저는 윈버를 정의하지 않았지만 지금은 프로젝트를 만들었지 만 여전히 똑같습니다. – Johan

3

문제는 당신이 _WIN32_WINNT을 사용해야 할 때, WINVER를 사용하고 있습니다. WINVER은 주로 매우 오래된 기능에만 영향을 미칩니다. 일반적으로 두 기능을 모두 정의하려고합니다. 당신의 Windows 버전 정의는 무엇

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

좋아, 지금은 새로운 오류 메시지가 발생했습니다 : 17:09:21 **** 구성의 증분 빌드 프로젝트 테스트를위한 디버그 **** 정보 : 내부 빌더는 빌드에 사용됩니다 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 빌드 완료 (3s.297ms 소요) – Johan

+0

링커 오류입니다. 아마도'-lshell32'를 사용하기를 원할 것입니다. 그러나 확실히 알기 위해서는 라이브러리를 봐야 할 것입니다. –

+0

프로젝트 속성에 라이브러리에 무엇인가를 포함해야합니까? : P – Johan

관련 문제