SHGetKnownFolderPath 未在此范围内声明
SHGetKnownFolderPath was not declared in this scope
我已经学习 Java-programming 大约 7 个月了,我对 c++ 产生了兴趣。我目前也在读一本 C++ 书。
我正在使用 eclipse c++,因为我对 eclipse 非常熟悉。
我用 C++ 做了大约 6 个项目(小的),到目前为止一切正常。
我的问题是我无法使用 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)下的最后一个括号有一个小箭头指向)
可能出了什么问题?
如果我能得到所有答案或提示,我将不胜感激。
Eclipse 没有问题,它正在正确处理编译器输出的错误。
编译器没有问题,它正确地抱怨试图在没有预先声明的情况下使用函数。
The official documentation 清楚地告诉您从哪里获得该声明:
由于此功能需要 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 字符串。您可以使用理解 UTF-16 的 wcout
,或调用 WideCharToMultiByte
来获取 cout
可以接受的 ASCII 字符串。
问题是您在使用 WINVER
,而您应该使用 _WIN32_WINNT
。 WINVER
主要只影响非常旧的功能——您通常需要同时定义它们。
#define WINVER 0x0600
#define _WIN32_WINNT 0x0600
我已经学习 Java-programming 大约 7 个月了,我对 c++ 产生了兴趣。我目前也在读一本 C++ 书。
我正在使用 eclipse c++,因为我对 eclipse 非常熟悉。
我用 C++ 做了大约 6 个项目(小的),到目前为止一切正常。
我的问题是我无法使用 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)下的最后一个括号有一个小箭头指向)
可能出了什么问题? 如果我能得到所有答案或提示,我将不胜感激。
Eclipse 没有问题,它正在正确处理编译器输出的错误。
编译器没有问题,它正确地抱怨试图在没有预先声明的情况下使用函数。
The official documentation 清楚地告诉您从哪里获得该声明:
由于此功能需要 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 字符串。您可以使用理解 UTF-16 的 wcout
,或调用 WideCharToMultiByte
来获取 cout
可以接受的 ASCII 字符串。
问题是您在使用 WINVER
,而您应该使用 _WIN32_WINNT
。 WINVER
主要只影响非常旧的功能——您通常需要同时定义它们。
#define WINVER 0x0600
#define _WIN32_WINNT 0x0600