windows下开多个CMD窗口多个进程输出

摘要:
这个话题有点尴尬。我不知道你是否理解。具体要求是:我有一个Helloworld程序,可以用来生成标准输出。我想在主程序中创建多个进程。每个进程都会打开一个窗口以显示其自己的输出。“当然,你可以根据自己的需要做很多事情,然后做各种各样的couts.1#include”stdafx。h“2#include345int_tmain6{78//UsingShellExecuteEx9HELLEXECUTEINFOsei;1011SecureZeroMemory;1213sei.cbSize=sizeof;14sei.lpVerb=L“open”;15sei.lpFile=L“cmd”;16sei.fMask=SEE_MASK_NOCLOSEPROCESS;17sei.lp参数=L“/kE:work logAnalyies multiCmd HelloWorld Debug HelloWorld.exe“;18sei.nShow=SW_SHOW;1920ShellExecuteEx;2122/WaitForSingleObject;2324printf;2526//UsingCreateProcess27STARTUPINFOsi;28SecureZeroMemory;2930si.cb=sizeof;313233PROCESS_INFORMATIONpi;3435BOOLresult=CreateProcess;4647if48{49WaitForSingle对象;50printf;51CloseHandle;52}5354系统;55返回0;56}打开多个控制台窗口以监视各种进程。我认为关键是要理解Windows控制台实际上是一个exe程序,所以在创建process或ShellExecuteEx时,需要创建cmd.exe命令,然后让cmd执行helloworld.exe程序。

题目有点拗口,不知道大家是否明白,具体的需求就是:

我有一个Helloworld程序,cout helloworld到标准输出,我想在一个主程序里面创建多个进程,每个进程开一个窗口,显示各自的输出。

大概就是这么个意思,关键在百度和谷歌上关于这个问题的说明都有点语焉不详,谷歌的E文的结果也不是很详细,但是还是有些提示性的东西(毕竟老外人多,

整好E对开发还是很重要),于是自己试了试,算是比较满意了,这里总结下,给需要的朋友参考。

用于输出的程序可以很简单,这里就一句cout << "Hello World!"<<endl;

当然你可以根据你的需要做多事很情,然后各种cout。

 1 #include "stdafx.h"
 2 
 3 using namespace std;
 4 
 5 int _tmain(int argc, _TCHAR* argv[])
 6 {
 7     cout << "Hello World!"<<endl;
 8     system("PAUSE");
 9     return 0;
10 }

主程序里面,可以采用两种不同的方式来打开窗口,一种是ShellExecuteEx,一种是CreateProcess.

需要注意的是CreateProcess,必须给他传一个CREATE_NEW_CONSOLE参数,不然helloworld显示在跟主程序在同一个窗口里面,这就不是我要的效果了。

 1 #include "stdafx.h"
 2 #include <Windows.h>
 3 
 4 
 5 int _tmain(int argc, _TCHAR* argv[])
 6 {
 7 
 8   //Using ShellExecuteEx  
 9   SHELLEXECUTEINFO sei;  
10     
11   SecureZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));  
12     
13   sei.cbSize = sizeof(SHELLEXECUTEINFO);  
14   sei.lpVerb = L"open";  
15   sei.lpFile = L"cmd";  
16   sei.fMask = SEE_MASK_NOCLOSEPROCESS;  
17   sei.lpParameters = L"/k E:\\work\\logAnalies\\multiCmd\\HelloWorld\\Debug\\HelloWorld.exe";  
18   sei.nShow = SW_SHOW;  
19  
20   ShellExecuteEx( &sei );   
21  
22   //WaitForSingleObject(sei.hProcess, INFINITE);    
23  
24   printf("Process with ID:%i has exited.\n", GetProcessId(sei.hProcess));
25 
26   // Using CreateProcess
27   STARTUPINFO si;  
28   SecureZeroMemory(&si, sizeof(STARTUPINFO));  
29  
30   si.cb = sizeof(STARTUPINFO);   
31   
32  
33   PROCESS_INFORMATION pi;  
34  
35   BOOL result = CreateProcess(  
36                       L"c:\\windows\\system32\\cmd.exe",  
37                       L"/k E:\\work\\logAnalies\\multiCmd\\HelloWorld\\Debug\\HelloWorld.exe",  
38                       NULL,  
39                       NULL,  
40                       FALSE,  
41                       CREATE_NEW_CONSOLE,  
42                       NULL,  
43                       NULL,  
44                       &si,  
45                       &pi);  
46  
47   if(result)  
48   {  
49     WaitForSingleObject(pi.hProcess, INFINITE);  
50     printf("Process with ID: %i has exited.\n", GetProcessId(pi.hProcess));  
51     CloseHandle(pi.hProcess);  
52   }  
53 
54   system("PAUSE");
55     return 0;
56 }

开多个控制台窗口用于各个进程的监控,关键点我觉得是要明白windows的控制台其实是一个exe程序,所以createprocess或者

ShellExecuteEx的时候,是创建cmd.exe命令,然后让cmd去执行我们的helloworld.exe程序。
补充一点的是cmd.exe 后面跟着的/k 参数,意思是执行完后cmd并不关闭,如果是/c 则表示关闭。

希望对各位tx有用!

.

免责声明:文章转载自《windows下开多个CMD窗口多个进程输出》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇嵌入式驱动开发之---Linux ALSA音频驱动(一)salt-job管理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C++ 术语(C++ Primer)

argument(实参):传递给被调用函数的值。block(块):花括号括起来的语句序列。buffer(缓冲区):一段用来存放数据的存储区域。IO 设备常存储输入(或输出)到缓冲区,并独立于程序动作对缓冲区进行读写。输出缓冲区通常必须显式刷新以强制输出缓冲区内容。默认情况下,读 cin 会刷新 cout;当程序正常结束时,cout 也被刷新。built-i...

c++之find()函数

c++之find()函数 在数组或者向量中,找到一个数,返回它的下标 #include <iostream> // std::cout #include <algorithm> // std::find #include <vector> // std::vector int main ()...

Crypto++入门学习笔记(DES、AES、RSA、SHA-256)

最先附上下载地址 背景(只是个人感想,技术上不对后面的内容构成知识性障碍,可以skip): 最近,基于某些原因和需要,笔者需要去了解一下Crypto++库,然后对一些数据进行一些加密解密的操作。 笔者之前没接触过任何加密解密方面的知识(当然,把每个字符的ASCII值加1之流对明文进行加密的“趣事”还是干过的,当时还很乐在其中。),甚至一开始连Crypto+...

在Lambda表达式中进行递归调用

Lambda表达式是一个匿名的方法,在开发期我们是不知道其方法名是什么的,所以我们要怎么递归调用呢? 如果你看过我这文章《让您知道您的方法是被何“人”调用 》的话,你应该会“啊哈”的拍一下头脑,思路就出来了,没错!!就是直接用StackFrame获取当前执行的方法,然后直接Invoke即可。示例代码:     class Test    {       ...

封装hiredis——C++与redis对接(一)(string的SET与GET操作)

  在菜鸟教程自学了redis,总想着像Mysql一样,在C/C++中进行对接。于是查询了一些资料,最后找到了hiredis。然而直接用它的话,难免有点不方便。于是,对其进行封装。   hiredis直接去git上克隆,地址:https://github.com/redis/hiredis。   下载好之后,由于其自带Makefile,只要make一下就编...

zbar配置

1、下载安装zbar,选择full全部安装。也可以从这里下载。  2、由于官方给的是32位的,继续下载64位的zbar 替换文件: 将ZBarWin64-master\lib 文件夹下 libzbar64-0.lib 文件复制到ZBar安装路径下的 lib 文件夹; 将 ZBarWin64-master\lib 文件夹下 libzbar64-0.dl...