MFC应用程序使用控制台的方法

来源:互联网 发布:水果销售软件 编辑:程序博客网 时间:2024/05/22 16:58

CreateFile函数除了可以新建和打开文件外,还可以建立Win32环境下的控制台缓冲。此时CreateFile函数的返回值是控制台缓冲的句柄。view plaincopy to clipboardprint?
HANDLE console_write=CreateFile("CONOUT$",//系统控制台缓冲文件  
GENERIC_READ|GENERIC_WRITE,//要读/写控制台缓冲文件,必须以读/写方式打开  
FILE_SHARE_READ|FILE_SHARE_WRITE,//如果多个线程要共享这个输出控制台,就要设置共享标志  
NULL,//文件安全属性,这里为NULL  
OPEN_EXISTING,//无论是输出控制台还是输入控制台,都要使用OPEN_EXISTING标志  
NULL,//被忽略的参数  
NULL);//被忽略的参数 
HANDLE console_write=CreateFile("CONOUT$",//系统控制台缓冲文件
GENERIC_READ|GENERIC_WRITE,//要读/写控制台缓冲文件,必须以读/写方式打开
FILE_SHARE_READ|FILE_SHARE_WRITE,//如果多个线程要共享这个输出控制台,就要设置共享标志
NULL,//文件安全属性,这里为NULL
OPEN_EXISTING,//无论是输出控制台还是输入控制台,都要使用OPEN_EXISTING标志
NULL,//被忽略的参数
NULL);//被忽略的参数

至此得到了一个可用的输出控制台,可以用类似的方法得到一个输入控制台:

 view plaincopy to clipboardprint?
HANDLE console_read=CreateFile("CONIN$",//注意输入控制台的缓冲文件变成了"CONIN$"  
        GENERIC_READ|GENERIC_WRITE,//以下同输出控制台  
        FILE_SHARE_READ|FILE_SHARE_WRITE,  
        NULL,  
        OPEN_EXISTING,  
        NULL,  
        NULL); 
HANDLE console_read=CreateFile("CONIN$",//注意输入控制台的缓冲文件变成了"CONIN$"
  GENERIC_READ|GENERIC_WRITE,//以下同输出控制台
  FILE_SHARE_READ|FILE_SHARE_WRITE,
  NULL,
  OPEN_EXISTING,
  NULL,
  NULL);

如果已经在程序的其他地方打开过控制台,可以用GetStdHandle()函数快速获得控制台句柄。GetStdHandle函数的唯一参数是一个DWORD标志,可能的取值有

STD_OUTPUT_HANDLE//获取输出控制台句柄
STD_INPUT_HANDLE//获取输入控制台句柄
STD_ERROR_HANDLE//获取错误输出控制台句柄

至此,就可以使用类似于读写磁盘文件的方法是用输入/输出控制台了。可以使用Write/ReadFile函数,更好的做法是使用Write/ReadConsole函数。微软给定解释是“Write/ReadFile”函数不支持Unicode。

view plaincopy to clipboardprint?
char * buffer={"Hello Console World!/n"};  
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),//获得输出控制台句柄  
buffer,//要输出内容的缓存  
strlen(buffer),//缓存长度  
NULL,NULL  
); 
char * buffer={"Hello Console World!/n"};
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),//获得输出控制台句柄
buffer,//要输出内容的缓存
strlen(buffer),//缓存长度
NULL,NULL
);

MFC里还是不能使用cout和printf函数的,也就是说输出数据的格式化不那么方便。解决办法只能是使用CString的Format函数然后再GetBuffer。同样,输入的时候只能从输入缓冲里接收字符串,需要自己分离里面的数据。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/shwneo/archive/2009/05/10/4165388.aspx