2016-07-28 7 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%働いています! いくつのコマンドラインに制限のないmaxスレッドを使用するか注意してください!

関連する問題