如何使用带有命令的向量列表来发送到 CreateProcess?

Posted

技术标签:

【中文标题】如何使用带有命令的向量列表来发送到 CreateProcess?【英文标题】:How use a vector list with commands in order to send to CreateProcess? 【发布时间】:2016-07-28 14:14:30 【问题描述】:

我想要一个脚本,用于传递由命令组成的向量列表以创建进程。

vector<string> list;
list.push.back(eeee -q 50  kekekekkee.jpg -o  kdkdkdkdd.jpg);
list.push.back(eeee -q 50  kefffffee.jpg -o  kefffffee.jpg);
list.push.back(eeee -q 50  kfffffff.jpg -o  kfffffff.jp);
list.push.back(eeee -q 50  kekeksfwefee.jpg -o  kekeksfwefee.jpg);

/* YOUR MAGICAL CODE HERE */

if (CreateProcessA(NULL, ?????, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi))

    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);

有人对此有解决方案/知道如何做到这一点吗?

【问题讨论】:

一个“脚本”?是否有可用的 C++ 脚本引擎? 这些eeee -q 50 kekekekkee.jpg -o kdkdkdkdd.jpg 行是什么语法? 我通常使用命令行参数,这是一个单一的字符串参数。如果您有要启动的程序的源代码,您还可以在命令行参数中添加一个文件选项,然后将所有其他命令行参数放入需要调用 CreateProcess() 的应用程序生成的文件中。 是命令行的概念 【参考方案1】:

首先,您的std::vector::push_back 调用需要字符串。

list.push_back("eeee -q 50  kekekekkee.jpg -o  kdkdkdkdd.jpg");
list.push_back("eeee -q 50  kefffffee.jpg -o  kefffffee.jpg");
list.push_back("eeee -q 50  kfffffff.jpg -o  kfffffff.jpg");
list.push_back("eeee -q 50  kekeksfwefee.jpg -o  kekeksfwefee.jpg");

然后循环遍历向量

for(auto&& ProcessArgs : list) 

   // So about CreateProcessA, it is a wrapper for CreateProcessW.
   // Normally the string being fed into CreateProcess must be mutable, but
   // in the case of CreateProcessA, a copy is made and converted to unicode to 
   // call CreateProcessW. Meaning we can give our string directly from
   // the std::string without needing to make a copy.
   // However, the way to do that is to use const_cast to remove the 
   // constness of std::string::c_str, so lets not and make a copy
   // anyway, because const_cast is bad practice.

   std::unique_ptr<char*> spString(new char[ProcessArgs.length() + 1]());
   std::copy(ProcessArgs.begin(), ProcessArgs.end(), spString.get());

   if (CreateProcessA(NULL, spString.get(), NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi))
   
      CloseHandle(pi.hThread);
      CloseHandle(pi.hProcess);
    

【讨论】:

您的代码中有更多错误!看我的回答。并感谢您的时间和您的观点!【参考方案2】:
int main()
vector<string list;
//populate vector
list.push_back("eeee -q 50  kekekekkee.jpg -o  kdkdkdkdd.jpg");
list.push_back("eeee -q 50  kefffffee.jpg -o  kefffffee.jpg");
list.push_back("eeee -q 50  kfffffff.jpg -o  kfffffff.jpg");
list.push_back("eeee -q 50  kekeksfwefee.jpg -o  kekeksfwefee.jpg");


for( int am =0; (unsigned)am < dirlist.size(); am++)

STARTUPINFOA si = sizeof(STARTUPINFOA), 0;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;

PROCESS_INFORMATION pi = 0;

cout <<endl;

        char myArray[list.size() +1];
        strcpy(myArray,list[am].c_str());
if (CreateProcessA(NULL,myArray, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi))

    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);


return 0;

这是 100% 测试的! 小心有多少 cmd 行没有限制最大线程!

【讨论】:

以上是关于如何使用带有命令的向量列表来发送到 CreateProcess?的主要内容,如果未能解决你的问题,请参考以下文章

将带有 glut 的点击坐标添加到向量的链接列表中

我可以对带有变量的向量使用 C++11 列表初始化器语法吗?

R中的字符向量作为带有knitr的逐项列表

如何将文件夹中的文件列表发送到Linux中的txt文件

如何使用带有逗号分隔值的 IIB 覆盖命令

如何在带有向量作为值类型的地图中添加值?