Как правильно использовать SHGetKnownFolderPath

Я пытаюсь найти файл

#include <iostream>
#include <Windows.h>
#include <ShlObj.h>
#include <sstream>
bool func()
{
    wchar_t* path = 0;
    std::stringstream ss;
    ss << path << "/asdsdadad/ad/ad/asd/ad/a/d";
    if (SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &path) == S_OK)
    {
        std::cout << "GOOD";
        return true;
    }
    else
    {
        std::cout << "BAD";
        return false;
    }
}
int main()
{
    func();
}

Но что бы я не вводил в path он возвращает true. Хотелось бы знать где я совершил ошибку?


Ответы (1 шт):

Автор решения: Dmitry Safonov

Ошибка в том, что функция SHGetKnownFolderPath определяет путь к одной из системных папок, о которых знает windows, в данном случае, раз ты передаёшь FOLDERID_LocalAppData константу, то в path запишется полный путь к папке AppData локального пользователя. Эта функция, если выполнилась успешно ВСЕГДА возвратит S_OK. Если же ты хочешь сравнить свой путь, из stringstream с системным путём, то сравнивай строки как-то так:

#include <iostream>
#include <Windows.h>
#include <ShlObj.h>
#include <sstream>

bool func()
{
    wchar_t* path = 0;
    std::wstringstream ss;
    ss << "C:\\Users\\dmitry\\AppData\\Local";

    std::wstring wstr = ss.str();

    if (SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &path) == S_OK) {
        std::wstring path_wstr(path);
        if (wstr.compare(path_wstr) == 0) {
            std::cout << "GOOD\n";
            return true;
        }
        else {
            std::cout << "BAD\n";
            return true;
        }
    }
}

int main()
{
    func();
    system("pause");
}
→ Ссылка