2016-06-02 14 views
0

ich ohne neue cmd geöffnet verrohrt ein paar Befehle ausführen wollen auszuführen (so kann ich system() einfach nicht verwenden) Dies ist der Befehl, den ich versuchen, auszuführen:Wie Createprocess oder ShellExecute verwenden verrohrt Befehle

C:\\openssl.exe enc -aes-128-ofb -d -in C:\\encrypted.bin -iv a2b050be9463 -K 6ba62eb7bb2ccace -nopad | C:\\\\mplayer.exe -" 
Diese

ist, was ich versucht:

WCHAR prog[] = L"C:\\openssl.exe"; 
WCHAR args[] = L"enc -aes-128-ofb -d -in C:\\encrypted.bin -iv a2b050be9463 -K 6ba62eb7bb2ccace -nopad | C:\\mplayer.exe -"; 

STARTUPINFO si; 
PROCESS_INFORMATION pi; 

ZeroMemory(&si, sizeof(si)); 
si.cb = sizeof(si); 
ZeroMemory(&pi, sizeof(pi)); 

CreateProcess(prog, args, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi); 

Und es hat nicht funktioniert (es ist kein Fehler, es ist einfach nicht zu öffnen) ich auch

tri diese ed:

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); 
HINSTANCE hinstRun1 = ShellExecute(NULL, L"open", L"cmd.exe", str2.c_str(), L"", SW_HIDE); 
CoUninitialize(); 

//str2 == C:\\openssl.exe enc -aes-128-ofb -d -in C:\\encrypted.bin -iv a2b050be9463 -K 6ba62eb7bb2ccace -nopad | C:\\\\mplayer.exe -") 

Dies ist auch nicht funktioniert (auch hier gibt es keine Fehler, dessen Öffnung nur nicht)

Wenn ich es so versucht:

system(("cmd.exe /c " str2).c_str()); 

Alles funktioniert gut (außer der Teil, der geöffnet hat auch ein cmd Fenster.)

Wie kann ich diese Zeile von C/C++ Programm ohne neue cmd Fenster ausführen?

+0

Überprüfen Sie [GetLastError] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms679360 (v = vs.85) .aspx) – RepeatUntil

+1

Sie haben ein paar Optionen. Sie können 'cmd' bitten, die ganze Arbeit zu erledigen. Es versteht das Symbol '|' für Rohrleitungen. Oder Sie können die Pipe zwischen den beiden Prozessen selbst erstellen, beide Prozesse erstellen und die Pipe zwischen ihnen verbinden. Letzteres beinhaltet den Aufruf von 'CreatePipe' zum Erstellen der Pipe. Und dann zwei Aufrufe von 'CreateProcess', eine für openssl und eine für mplayer. Beginnen Sie mit dem Lesen einiger Dokumentation dieser API-Funktionen und dann einige Beispielprogramme, die Pipes verwenden. –

+0

Sie können Rohre mit fork()/vfork() verwenden, um ähnliche Funktionen zu erzielen. Hast du poen() ausprobiert? – sagar

Antwort

0

Wenn Sie alles unter Kontrolle haben wollen, müssen Sie beide Prozesse (openssl und mplayer) selbst erstellen. Das wären also zwei CreateProcess Anrufe. Natürlich müssen Sie die Umleitung selbst erstellen, und zwar unter Verwendung von CreatePipe, bevor Sie die Prozesse erstellen.

Hier ist ein Beispiel (haben sie nicht kompiliert, kann eine gewisse Abstimmung erforderlich):

HANDLE proc1_out; 
HANDLE proc2_in; 
SECURITY_ATTRIBUTES security_attributes; 

// create the pipe between the processes 
security_attributes.nLength = sizeof(SECURITY_ATTRIBUTES); 
security_attributes.bInheritHandle = TRUE; // pipe handles should be inheritable by sub-processes 
security_attributes.lpSecurityDescriptor = NULL; 
CreatePipe(&proc2_in, &proc1_out, &security_attributes, 0); 

// create the first process 
WCHAR proc1_app[] = L"C:\\openssl.exe"; 
WCHAR proc1_cmd_line[] = L"openssl enc -aes-128-ofb -d -in C:\\encrypted.bin -iv a2b050be9463 -K 6ba62eb7bb2ccace -nopad"; 
PROCESS_INFORMATION proc1_info; 
STARTUPINFO proc1_startup_info; 
ZeroMemory(&proc1_info, sizeof(PROCESS_INFORMATION)); 
ZeroMemory(&proc1_startup_info, sizeof(STARTUPINFO)); 
proc1_startup_info.cb = sizeof(STARTUPINFO); 
proc1_startup_info.hStdInput = GetStdHandle(STD_INPUT_HANDLE); 
proc1_startup_info.hStdOutput = child_output_write; // redirected output 
proc1_startup_info.hStdError = GetStdHandle(STD_ERROR_HANDLE); 
proc1_startup_info.dwFlags |= STARTF_USESTDHANDLES; 
CreateProcess(proc1_app, proc1_cmd_line, NULL, NULL, TRUE, 0, NULL, NULL, &proc1_startup_info, &proc1_info); 

// create the second process 
WCHAR proc2_app[] = L"C:\\mplayer.exe"; 
WCHAR proc2_cmd_line[] = L"mplayer -"; 
PROCESS_INFORMATION proc2_info; 
STARTUPINFO proc2_startup_info; 
ZeroMemory(&proc2_info, sizeof(PROCESS_INFORMATION)); 
ZeroMemory(&proc2_startup_info, sizeof(STARTUPINFO)); 
proc2_startup_info.cb = sizeof(STARTUPINFO); 
proc2_startup_info.hStdInput = proc2_in; // redirected input 
proc2_startup_info.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); 
proc2_startup_info.hStdError = GetStdHandle(STD_ERROR_HANDLE); 
proc2_startup_info.dwFlags |= STARTF_USESTDHANDLES; 
CreateProcess(proc2_app, proc2_cmd_line, NULL, NULL, TRUE, 0, NULL, NULL, &proc2_startup_info, &proc2_info); 

Hinweise: in dem Befehlszeilenargument zu Createprocess übergeben, das erste „Wort“ in der Zeichenfolge das sein muss, Prozessname (das war nicht das, was du gemacht hast).

+0

danke, ich habe so etwas und seine Arbeit 'jetzt die q. Wie verhindere ich, dass der mplayer-Prozess das zweite cmd-Fenster öffnet, wie mache ich das? –

+0

Setzen Sie in proc2_startup_info das Flag * STARTF_USESHOWWINDOW * in * dwFlags * und versuchen Sie, das * wShowWindow * -Member auf * SW_HIDE * zu setzen. – dim

+0

Ich ändere wShowWindow zu SW_HIDE, was hast du damit gemeint "setze das STARTF_USESHOWWINDOW Flag in dwFlags"? –

Verwandte Themen