【问题标题】:Getting system env in c++ from windows从 Windows 获取 C++ 中的系统环境
【发布时间】:2013-09-14 04:50:20
【问题描述】:

我尝试从我的 C++ 应用程序中获取 Windows 中的一些系统环境。我尝试了 getenv 和 GetEnvironmentVariable 但都卡住了。程序编译,但是当我运行它时,我看到指针闪烁了一段时间,没有任何显示,然后程序崩溃并显示消息:

RUN FAILED(退出值 -1 073 741 819,总时间:10s)

我尝试了很多来自网络的示例,所有示例都给出了相同的结果。我试过的一些例子:

char l_strSingleVal[20];
GetEnvironmentVariable("PATH", l_strSingleVal,20);
printf("VariableName: %s\n",l_strSingleVal);

或:

std::string string_variable;
const std::string MY_VAR = "PATH";

char const* temp = std::getenv(MY_VAR.c_str());
if(temp != NULL)
{
    string_variable = std::string(temp);            
}   

【问题讨论】:

  • -1073... 可能是因为您的main 末尾没有“return 0”。
  • @MatsPetersson:怎么样?也许编译器坏了......
  • 啊,不,这是内存冲突,0xc0000005 错误代码。我希望它在一些尚未在此处发布的代码中......至少如果第二个版本确实提供了这种行为。
  • 我在 main 的末尾返回 0。我使用 MinGW。该项目有点大,但我相信我发布了重要部分 - 当我用简单的 std::cout

标签: c++ windows environment-variables


【解决方案1】:

你有未定义的行为:

来自 GetEnvironmentVariable 规范(l_strSingleVal 等同于 lpBuffer):http://msdn.microsoft.com/en-us/library/windows/desktop/ms683188(v=vs.85).aspx

如果 lpBuffer 不足以容纳数据,则返回值为 保存字符串及其所需的缓冲区大小(以字符为单位) 终止空字符和 lpBuffer 的内容未定义。

在您的情况下访问 lpBuffer 是 UB。 PATH 的 20 个字符的缓冲区太小了。您需要检查 GetEnvironmentVariable 的返回值(在您的情况下,它将告诉您成功调用所需的缓冲区大小)。

【讨论】:

  • 我给了 20000 而不是 20 结果是一样的... :/
  • 其他地方可能有更多 UB。您介意发布整个功能吗?顺便说一句,这种方法很粗糙:您应该准确分配所需的空间;使用 GetEnvironmentVariable 的初始调用返回。
  • 我只需要获取 APPDATA env 的值 - 我不知道它会有多大......这是整个功能 - 我只是尝试通过获取这个 var 并显示它.完成后,我可以继续使用该应用程序...
【解决方案2】:

试过C标准库函数getenv?它适用于我的 Windows PC。

例子:

#include <stdlib.h>
#include <stdio.h>
int main()
{
 char * src = getenv("PATH");
 if (src)
  printf("value of PATH is: %s", src);
 else 
  printf("empty or not defined");
 return 0;
}

【讨论】:

  • 是的,我也遇到了同样的问题。
猜你喜欢
  • 2013-06-17
  • 2016-09-29
  • 1970-01-01
  • 2019-03-28
  • 2016-03-09
  • 1970-01-01
  • 2011-01-17
  • 2017-12-15
  • 1970-01-01
相关资源
最近更新 更多