如何使用带有命令的向量列表来发送到 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?的主要内容,如果未能解决你的问题,请参考以下文章