SHGetKnownFolderPath未在此范围内声明

时间:2015-01-26 15:20:18

标签: c++ winapi known-folders

我已经学习Java编程大约7个月了,我对c ++感兴趣。我目前正在阅读一本c ++书。

我正在使用eclipse c ++,因为我对eclipse非常熟悉。

我在c ++中制作了6个项目(小项目),到目前为止一切运行良好。

我的问题是我无法使用SHGetKnownFolderPath方法。 完整的行是红色的,尽管我已导入所有内容,构建它,尝试运行它。我已经在互联网网站上查看了,我使用了与其他人相同的代码,但仍然没有为我工作。

它说:无法解析函数SHGetKnownFolderPath

我在64位Windows 8计算机上。 这是代码: 的更新

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

有一个小箭头指向&amp; wszPath下的最后一个括号

可能出现什么问题? 我将非常感谢能得到的所有答案或提示。

2 个答案:

答案 0 :(得分:6)

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字符串。您可以使用了解UTF-16的wcout,也可以调用WideCharToMultiByte来获取cout可以接受的ASCII字符串。

答案 1 :(得分:4)

当您使用WINVER时,问题是您正在使用_WIN32_WINNTWINVER主要仅影响非常旧的功能 - 您通常希望同时定义它们。

#define WINVER 0x0600
#define _WIN32_WINNT 0x0600