如何使用 CreateProcess 或 ShellExecute 来执行管道命令
How to use CreateProcess or ShellExecute to execute piped commands
我想在没有打开新cmd
的情况下执行一些通过管道传输的命令(所以我不能只使用system()
)这是我尝试执行的命令:
C:\openssl.exe enc -aes-128-ofb -d -in C:\encrypted.bin -iv a2b050be9463 -K 6ba62eb7bb2ccace -nopad | C:\\mplayer.exe -"
这是我尝试过的:
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);
它没有工作(没有错误,它只是没有打开)
我也试过这个:
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 -")
这也不起作用(再次没有错误,只是没有打开)
当我这样尝试时:
system(("cmd.exe /c " str2).c_str());
一切正常(除了它打开的部分也是一个cmd
窗口。
如何在没有新cmd
窗口的情况下从 c/c++ 程序执行此行?
如果你想控制一切,你需要自己创建两个进程(openssl和mplayer)。所以这将是两个CreateProcess
电话。当然,您还必须自己创建重定向,这是在创建进程之前使用 CreatePipe
,完成的。
下面是一个示例(尚未编译,可能需要一些调整):
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);
注意:在传递给 CreateProcess 的命令行参数中,字符串中的第一个"单词"必须是进程名称(这不是您正在执行的操作)。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 执行函数时导致崩溃的变量
- IPC使用多个管道和分支进程来运行Python程序
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 递归执行C 中的Linux管道命令
- 具有读写功能的 UNIX 管道系统可执行"ls -la"命令
- 如何使用 CreateProcess 或 ShellExecute 来执行管道命令
- 使用外部可执行文件作为管道的Qt 'way'是什么?
- popen 管道执行程序和读取输出的替代方法
- 执行控制台程序,写入标准输入并使用管道读取结果
- 在NAO上分叉、执行和管道
- 构建执行管道的c++库
- 如何执行和写入stdin并将stdout管道连接到套接字
- 如何在分叉和执行后使用带有选择的管道
- 系统/管道调用更改传递给执行的命令中的特殊字符
- c++遗传编程:调用链接器/编译器,执行编译后的程序和管道输入/输出