Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中的受控环境中执行Windows命令+;_C++_C++11_Winapi - Fatal编程技术网

C++ 在C+中的受控环境中执行Windows命令+;

C++ 在C+中的受控环境中执行Windows命令+;,c++,c++11,winapi,C++,C++11,Winapi,我目前正试图在Windows下的C++11中执行一个命令,我希望环境是我手动设置的字符** 我看到了popen()、system()和CreateProcess()函数,但我无法用这些函数实现这一点。 我要寻找的是UNIX exec*函数的替代品,它允许我们精确地定义环境。您需要以下参数的lpEnvironment: lpEnvironment[在中,可选] 指向新进程的环境块的指针。如果此参数为NULL,则新进程将使用调用进程的环境 环境块由以null结尾的字符串组成的以null结尾的块组成。

我目前正试图在Windows下的C++11中执行一个命令,我希望环境是我手动设置的字符**

我看到了popen()、system()和CreateProcess()函数,但我无法用这些函数实现这一点。
我要寻找的是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”
。这和我给出的版本一样痛苦。