HRESULT to string(获取文档路径)C ++

时间:2014-09-02 14:02:14

标签: c++ winapi directory stdstring

我使用以下函数尝试获取文档文件夹的路径,然后将该路径转换为std :: string:

std::string getpath() {
    TCHAR documents[MAX_PATH];
    HRESULT result = SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, documents);
    std::stringstream pff;
    pff << result;
    return pff.str();
}

执行此操作时,我收到&#34;无效的文件名错误&#34;当试图追加&#34; \ filename&#34;到了字符串。

请帮忙!

编辑:以下是我追加路径的方式:

std::string folder = getpath() + "\\Folder";

我认为双逃生符号仍然适用。

3 个答案:

答案 0 :(得分:1)

您不打印documents,而是result

尝试这样的事情:

std::string getpath() {
    TCHAR documents[MAX_PATH];

    HRESULT result = SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, documents);
    if (result == S_OK) // SUCCEEDED(result) can be problematic
                        // since S_FALSE is a possible return value
    {
        std::stringstream pff;
        pff << documents;
        return pff.str();
    }
    // handle error somehow
    return "";
}

这是一个支持Unicode的版本:

std::wstring getpath() {
    TCHAR documents[MAX_PATH];

    HRESULT result = SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, documents);
    if (result == S_OK) // SUCCEEDED(result) can be problematic
        // since S_FALSE is a possible return value
    {
        std::wstringstream pff;
        pff << documents;
        return pff.str();
    }
    // handle error somehow
    return L"";
}

答案 1 :(得分:1)

您的代码失败,因为您实际上正在构建SHGetFolderPath返回值(即错误代码)之外的字符串。您应该使用返回的路径。

由于不推荐declare @i bigint set @i=25 select @i+getdate() select cast ( @i+getdate() as int) ,您应该使用SHGetKnownFolderPath。除此之外,您不会意外地构造MBCS编码的路径名。并且没有任意42658 (260)字符限制。

以下代码检索当前用户的文档路径 1

SHGetFolderPath

注意:MAX_PATH未正式记录,因此在未来版本的编译器中可能无法使用。具有类似功能的自定义实现可能如下所示:

#include <string>
#include <ShlObj.h>
#include <comdef.h>

std::wstring GetDocumentPath() {
    wchar_t* pOut = nullptr;
    // Retrieve document path (CheckError throws a _com_error exception on failure)
    _com_util::CheckError( ::SHGetKnownFolderPath( FOLDERID_Documents, KF_FLAG_DEFAULT,
                                                   nullptr, &pOut ) );
    // Attach returned buffer to a smart pointer with custom deleter. This
    // is necessary, because the std::wstring c'tor throws on failure.
    // Without this smart pointer, any exception would leak memory.
    auto deleter = []( void* p ) { ::CoTaskMemFree( p ); };
    std::unique_ptr<wchar_t, decltype( deleter )> buffer{ pOut, deleter };
    return std::wstring{ buffer.get() };
    // Invisible: Run deleter for buffer, cleaning up allocated resources.
}
记录

_com_raise_error会引发_com_error异常。 FAILED宏也会被记录下来。

<小时/> 1 已知的文件夹路径是可自定义的(请参阅Folder Redirection Overview)。你不能简单地尝试自己构建它们。您必须向Shell索取此信息。

答案 2 :(得分:-2)

我最终抛弃了SHGetFolderPath,并采用了更直截了当的_dupenv_s:

std::string getpath() {
    char* buf = 0;
    size_t sz = 0;
    if (_dupenv_s(&buf, &sz, "USERPROFILE") == 0) {
        std::string path(buf);
        path += "\\Documents\\Folder";
        return path;
    }
    return NULL;
}