2016-07-28 23 views
-1

Ich möchte ein Skript zum Übergeben einer Vektorliste, die aus Befehlen besteht, um einen Prozess zu erstellen.Wie verwende ich eine Vektorliste mit Befehlen, um sie an CreateProcess zu senden?

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

Hat jemand eine Lösung für diese/irgendeine Idee, wie man das macht?

+0

Ein "Skript"? Ist dort eine C++ Scripting Engine verfügbar? –

+0

Welche Art von Syntax sind diese 'eeee -q 50 kekekkkee.jpg -o kdkdkdkdd.jpg' Zeilen? –

+1

Ich verwende normalerweise Befehlszeilenargumente für diesen Parameter, der ein einzelner String-Parameter ist. Wenn Sie die Quelle des Programms haben, das Sie starten, können Sie auch eine Dateioption zu Ihren Befehlszeilenargumenten hinzufügen und dann alle anderen Befehlszeilenargumente in eine Datei einfügen, die von Ihrer Anwendung generiert wird und CreateProcess() aufrufen muss. – drescherjm

Antwort

1

Zuerst benötigt Ihr std::vector::push_back Anruf Zeichenfolgen.

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

Dann einfach eine Schleife durch den Vektor

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

Sie haben mehr Fehler in Ihrem Code! Siehe meine Antwort. und danke für deine Zeit und deinen Standpunkt! –

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

Diese arbeitet zu 100% getestet !! vorsichtig mit wieviel cmd Zeile ohne Beschränkung max Threads!