使用cpp获取环境变量

Getting Enviroment Variable with cpp

所以我一直在想办法用c++找到一个环境变量并在屏幕上打印出来 但在过去的 3 个小时左右,我一直被困住了。当我打印出 currentDesktop 变量时,它只打印出“/Desktop”。但是我要找的是它前面的用户名。 我一直在阅读 Microsoft 论坛上有关 GetEnviromentVariable 函数的文档,这就是我到目前为止所想到的。 感谢帮助,因为我还不是很有经验,谢谢。

#include <iostream>
#include <string>
#include <windows.h>
#include <fstream>
#define BUFSIZE 4096
using namespace std;
int main()
{
    LPCWSTR Env = L"%USERPROFILE";
    LPTSTR pszOldVal;
    string IPADD;
     pszOldVal = (LPTSTR)malloc(BUFSIZE * sizeof(TCHAR));
    if (NULL == pszOldVal)
    {
        printf("Out of memory\n");
        return FALSE;
    }
    string currentDesktop = GetEnvironmentVariable(Env,pszOldVal,BUFSIZE) + "\Desktop";
    cout << currentDesktop;
    return 0;

}

您误用了 GetEnvironmentVariable() 函数。一方面,您缺少变量名称 L"%USERPROFILE" 的尾随 %。另一方面,return 值是复制到提供的缓冲区中的字符数。您将该整数添加到字符串文字 "\Desktop",这不是您想要的。

试试这个:

#include <iostream>
#include <string>
#include <windows.h>

std::wstring GetEnv(const std::wstring &varName)
{
    std::wstring str;
    DWORD len = GetEnvironmentVariableW(varName.c_str(), NULL, 0);
    if (len > 0)
    {
        str.resize(len);
        str.resize(GetEnvironmentVariableW(varName.c_str(), &str[0], len));
    }
    return str;
}

std::wstring GetUserDesktopPath()
{
    std::wstring path = GetEnv(L"%USERPROFILE%");
    if (!path.empty()) path += L"\Desktop";
    return path;
}

int main()
{
    std::wstring currentDesktop = GetUserDesktopPath();
    std::wcout << currentDesktop;
    return 0;
}

也就是说,如果您只想要用户名,请使用 %USERNAME% 而不是 %USERPROFILE%。或者更好,使用 GetUserName() 而不是 GetEnvironmentVariable():

#include <iostream>
#include <string>
#include <windows.h>

std::wstring GetUserName()
{
    std::wstring str;
    DWORD len = 0;
    if (!GetUserNameW(NULL, &len))
    {
        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
        {
            str.resize(len);
            if (GetUserNameW(&str[0], &len))
                str.resize(len-1);
            else
                str = L"";
        }
    }
    return str;
}

int main()
{
    std::wstring currentUser = GetUserName();
    std::wcout << currentUser;
    return 0;
}

但是,获取用户桌面路径的正确方法是只询问Windows特定路径,不要假设 它位于用户配置文件的根目录中,或者名为 Desktop。对该查询使用 SHGetFolderPath() or SHGetKnownFolderPath(),例如:

#include <iostream>
#include <string>
#include <windows.h>
#include <shlobj.h>

std::wstring GetFolderPath(CSIDL folderID)
{
    WCHAR path[MAX_PATH] = {};
    SHGetFolderPathW(NULL, folderID, NULL, SHGFP_TYPE_CURRENT, path);
    return path;
}
/* or:
std::wstring GetFolderPath(REFKNOWNFOLDERID folderID)
{
    std::wstring str;
    PWSTR path = NULL;
    if (SHGetKnownFolderPath(folderID, 0, NULL, &path) == S_OK)
        str = path;
    CoTaskMemFree(path);
    return str;
}
*/

std::wstring GetUserDesktopPath()
{
    return GetFolderPath(CSIDL_DESKTOPDIRECTORY);
    // or: return GetFolderPath(FOLDERID_Desktop);
}

int main()
{
    std::wstring currentDesktop = GetUserDesktopPath();
    std::wcout << currentDesktop;
    return 0;
}