-1

我已经学习 Java 编程大约 7 个月了,并且对 c++ 产生了兴趣。我目前也在读一本 c++ 书。

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

我用 C++ 制作了 6 个项目(小项目),到目前为止一切正常。

我的问题是我无法让 SHGetKnownFolderPath 方法工作。完整的行是 red ,尽管我已经导入了所有内容,构建它,尝试运行它。我检查了互联网站点,并且使用了与其他人相同的代码,但仍然不适合我。

它说:函数 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);

&wszPath 下的最后一个括号有一个小箭头)

什么可能是错的?我将不胜感激所有我能得到的答案或提示。

4

2 回答 2

6

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来获取cout可以接受的 ASCII 字符串。

于 2015-01-26T15:27:41.750 回答
5

问题是您正在使用WINVER,什么时候应该使用_WIN32_WINNT. WINVER主要只影响非常古老的功能——您通常希望同时定义它们。

#define WINVER 0x0600
#define _WIN32_WINNT 0x0600
于 2015-01-26T16:05:10.687 回答