使用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;
}
所以我一直在想办法用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;
}