【问题标题】:How use a vector list with commands in order to send to CreateProcess?如何使用带有命令的向量列表来发送到 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() 的应用程序生成的文件中。
  • 是命令行的概念

标签: c++ windows vector char 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 行没有限制最大线程!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多