积极答复者
求教与C++语句 std::cout<<"Hello!"<<std::endl; 等价的API调用序列!

问题
-
我用Dependency Walker看了下一个我自己编写的,只包含一条 std::cout<<"Hello!"<<std::endl; 的控制台程序,有点糊涂了,因为那个程序包含了几个不同的writeconcole类型函数,想问下,如果我自己不用std::cout的方法,完全通过调用API来实现这一功能,我该调用哪些函数啊!有点不太确定。
我曾经试着用调试的方法跟踪,结果没有跟出来,我还不太会调试。不好意思!
-----------------------------------------------------
我补充说一下,就是说这个std::cout<<"Hello!"<<std::endl;的实际效果就是在控制台窗口中打印一条 Hello!然后回车。我的意思就是,如果我只用Windows提供的API来达到同样的效果的话,我应该怎么调用API,我记得好象是先要有一个getstdhandle吧!然后接下来应该是writeconcole函数,那我看了MSDN里面,发现writeconcole函数好象有好几个,我不知道该调用哪一个。
凝气神通- 已移动 周雪峰MVP, Moderator 2009年4月10日 1:34 移动主题
- 已编辑 PALadinWIC 2009年4月10日 15:34
答案
-
首先用 GetStdHandle 来获得标准输入的句柄:
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
if (hout == INVALID_HANDLE_VALUE ||
GetFileType(hout) == FILE_TYPE_UNKNOWN) {
return FALSE;
}
注意这里既验证了返回的句柄是否为INVALID_HANDLE_VALUE,也检查了是否FILE_TYPE_UNKNOWN。
因为在终端程序中,用户可以转移标准输出。比如,dir > tmp.txt,这里就是把标准输出转移到一个名作 tmp.txt 的文件名上。用户亦可以把标准输出转移到空值上,比如 dir > nul,这样会导致什么都输出不了。
获取句柄后,可以用WriteFile函数来输出:
if (HasConsole) {
char* pvalue = "Hello world";
int count = strlen(out);
int writecount;
WriteFile(hout, pvalue, count, &writecount, NULL);
}
详情可以看printf函数的实现代码:
C:\Program Files\Microsoft Visual Studio 9.0\VC\CRT\src\printf.c
C:\Program Files\Microsoft Visual Studio 9.0\VC\CRT\src\_file.c
C:\Program Files\Microsoft Visual Studio 9.0\VC\CRT\src\write.c
MCPD (Windows & Web)- 已标记为答案 PALadinWIC 2009年4月24日 16:10
全部回复
-
首先用 GetStdHandle 来获得标准输入的句柄:
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
if (hout == INVALID_HANDLE_VALUE ||
GetFileType(hout) == FILE_TYPE_UNKNOWN) {
return FALSE;
}
注意这里既验证了返回的句柄是否为INVALID_HANDLE_VALUE,也检查了是否FILE_TYPE_UNKNOWN。
因为在终端程序中,用户可以转移标准输出。比如,dir > tmp.txt,这里就是把标准输出转移到一个名作 tmp.txt 的文件名上。用户亦可以把标准输出转移到空值上,比如 dir > nul,这样会导致什么都输出不了。
获取句柄后,可以用WriteFile函数来输出:
if (HasConsole) {
char* pvalue = "Hello world";
int count = strlen(out);
int writecount;
WriteFile(hout, pvalue, count, &writecount, NULL);
}
详情可以看printf函数的实现代码:
C:\Program Files\Microsoft Visual Studio 9.0\VC\CRT\src\printf.c
C:\Program Files\Microsoft Visual Studio 9.0\VC\CRT\src\_file.c
C:\Program Files\Microsoft Visual Studio 9.0\VC\CRT\src\write.c
MCPD (Windows & Web)- 已标记为答案 PALadinWIC 2009年4月24日 16:10