C++ 在C+中的受控环境中执行Windows命令+;
我目前正试图在Windows下的C++11中执行一个命令,我希望环境是我手动设置的字符** 我看到了popen()、system()和CreateProcess()函数,但我无法用这些函数实现这一点。C++ 在C+中的受控环境中执行Windows命令+;,c++,c++11,winapi,C++,C++11,Winapi,我目前正试图在Windows下的C++11中执行一个命令,我希望环境是我手动设置的字符** 我看到了popen()、system()和CreateProcess()函数,但我无法用这些函数实现这一点。 我要寻找的是UNIX exec*函数的替代品,它允许我们精确地定义环境。您需要以下参数的lpEnvironment: lpEnvironment[在中,可选] 指向新进程的环境块的指针。如果此参数为NULL,则新进程将使用调用进程的环境 环境块由以null结尾的字符串组成的以null结尾的块组成。
我要寻找的是UNIX exec*函数的替代品,它允许我们精确地定义环境。您需要以下参数的
lpEnvironment
:
lpEnvironment[在中,可选]
指向新进程的环境块的指针。如果此参数为NULL,则新进程将使用调用进程的环境
环境块由以null结尾的字符串组成的以null结尾的块组成。每个字符串的格式如下:
名称=值\0
例如:
// example for storing environment variables dynamically
std::map<std::string, std::string> env = { {"name1", "value1"}, {"name2", "value2"} };
// example for generating block of strings
std::vector<char> envBlock;
std::for_each(env.begin(), env.end(),
[&envBlock](const std::pair<std::string, std::string> & p) {
std::copy(p.first.begin(), p.first.end(), std::back_inserter(envBlock));
envBlock.push_back('=');
std::copy(p.second.begin(), p.second.end(), std::back_inserter(envBlock));
envBlock.push_back('\0');
}
);
envBlock.push_back('\0');
// feed this into ::CreateProcess()
LPVOID lpEnvironment = (LPVOID)envBlock.data();
//动态存储环境变量的示例
映射环境={{“name1”,“value1”},{“name2”,“value2”};
//生成字符串块的示例
std::向量块;
std::for_each(env.begin()、env.end(),
[&envBlock](常量标准::对和对){
std::copy(p.first.begin()、p.first.end()、std::back_插入器(envBlock));
envBlock.push_back('=');
std::copy(p.second.begin()、p.second.end()、std::back_插入器(envBlock));
envBlock.push_back('\0');
}
);
envBlock.push_back('\0');
//将其馈送到::CreateProcess()中
LPVOID lpEnvironment=(LPVOID)envBlock.data();
您需要以下参数的lpEnvironment
参数:
lpEnvironment[在中,可选]
指向新进程的环境块的指针。如果此参数为NULL,则新进程将使用调用进程的环境
环境块由以null结尾的字符串组成的以null结尾的块组成。每个字符串的格式如下:
名称=值\0
例如:
// example for storing environment variables dynamically
std::map<std::string, std::string> env = { {"name1", "value1"}, {"name2", "value2"} };
// example for generating block of strings
std::vector<char> envBlock;
std::for_each(env.begin(), env.end(),
[&envBlock](const std::pair<std::string, std::string> & p) {
std::copy(p.first.begin(), p.first.end(), std::back_inserter(envBlock));
envBlock.push_back('=');
std::copy(p.second.begin(), p.second.end(), std::back_inserter(envBlock));
envBlock.push_back('\0');
}
);
envBlock.push_back('\0');
// feed this into ::CreateProcess()
LPVOID lpEnvironment = (LPVOID)envBlock.data();
//动态存储环境变量的示例
映射环境={{“name1”,“value1”},{“name2”,“value2”};
//生成字符串块的示例
std::向量块;
std::for_each(env.begin()、env.end(),
[&envBlock](常量标准::对和对){
std::copy(p.first.begin()、p.first.end()、std::back_插入器(envBlock));
envBlock.push_back('=');
std::copy(p.second.begin()、p.second.end()、std::back_插入器(envBlock));
envBlock.push_back('\0');
}
);
envBlock.push_back('\0');
//将其馈送到::CreateProcess()中
LPVOID lpEnvironment=(LPVOID)envBlock.data();
CreateProcess
有一个名为lpEnvironment
的参数来设置子环境变量。如何使用CreateProcess
(即显示代码)?哦,糟糕,我应该有三重检查CreateProcess…或_execle()和friends,那些你喜欢在MSVC上工作的unix函数。@HansPassant,但你没有fork()
,所以你不能用\u exec*
获得\u popen
或CreateProcess
的行为,否则你就在Cygwin之下了。但是\u spawn*
函数确实可以做到这一点。请注意,如果没有通常的环境变量集,某些软件将无法正常工作。(大多数编写良好的软件都会这样。)CreateProcess
有一个名为lpEnvironment
的参数来设置孩子的环境变量。如何使用CreateProcess
(即显示代码)?哦,糟糕,我应该有三重检查CreateProcess…或_execle()和friends,那些你喜欢在MSVC上工作的unix函数。@HansPassant,但你没有fork()
,所以你不能用\u exec*
获得\u popen
或CreateProcess
的行为,否则你就在Cygwin之下了。但是\u spawn*
函数确实可以做到这一点。请注意,如果没有通常的环境变量集,某些软件将无法正常工作。(大多数编写良好的软件都会这样做。)别误会,但我不明白为什么我更喜欢这个而不是LPVOID lpEnvironment=“name1=value1\0name2=value2\0”代码>。你能解释一下吗?@mikedu95这个想法是,你可以动态地改变你想在向量中定义的环境变量,然后在需要时生成块。这是一个示例片段;生成LPVOID块的代码最好使用单独的方法。在这种情况下,最好使用map
。对于向量
,我看不出如何在向量初始化后轻松地将变量“name2”
的值更改为“new\u value2”
。这和我给出的版本一样痛苦。别误会,但我不明白为什么我更喜欢这个而不是LPVOID lpEnvironment=“name1=value1\0name2=value2\0”代码>。你能解释一下吗?@mikedu95这个想法是,你可以动态地改变你想在向量中定义的环境变量,然后在需要时生成块。这是一个示例片段;生成LPVOID块的代码最好使用单独的方法。在这种情况下,最好使用map
。对于向量
,我看不出如何在向量初始化后轻松地将变量“name2”
的值更改为“new\u value2”
。这和我给出的版本一样痛苦。