2016-07-28 49 views
-1

我想要一个脚本来传递一个由命令组成的向量列表来创建一个进程。如何使用带有命令的向量列表来发送到CreateProcess?

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); 
} 

有人有这个/任何想法的解决方案如何做到这一点?

+0

“脚本”?那里有可用的C++脚本引擎吗? –

+0

这些'eeee -q 50 kekekekkee.jpg -o kdkdkdkdd.jpg'行有什么样的语法? –

+1

我通常使用命令行参数来表示这是单个字符串参数。如果你有启动程序的源代码,你也可以在你的命令行参数中添加一个文件选项,然后把所有其他命令行参数放在你的应用程序生成的文件中,该文件需要调用CreateProcess()。 – drescherjm

回答

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); 
    } 
} 
+0

你的代码中有更多的错误!看到我的答案。和thx为您的时间和你的观点! –

0
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线没有限制最大线程!