none
求教与C++语句 std::cout<<"Hello!"<<std::endl; 等价的API调用序列! RRS feed

  • 问题

  • 我用Dependency Walker看了下一个我自己编写的,只包含一条 std::cout<<"Hello!"<<std::endl; 的控制台程序,有点糊涂了,因为那个程序包含了几个不同的writeconcole类型函数,想问下,如果我自己不用std::cout的方法,完全通过调用API来实现这一功能,我该调用哪些函数啊!有点不太确定。

    我曾经试着用调试的方法跟踪,结果没有跟出来,我还不太会调试。不好意思!


    -----------------------------------------------------

    我补充说一下,就是说这个std::cout<<"Hello!"<<std::endl;的实际效果就是在控制台窗口中打印一条 Hello!然后回车。我的意思就是,如果我只用Windows提供的API来达到同样的效果的话,我应该怎么调用API,我记得好象是先要有一个getstdhandle吧!然后接下来应该是writeconcole函数,那我看了MSDN里面,发现writeconcole函数好象有好几个,我不知道该调用哪一个。






    凝气神通
    2009年4月9日 15:26

答案

  • 首先用 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
    2009年4月22日 12:40

全部回复

  • 不太明白你的意思如果你想明白std::cout是调用的什么对象。CRT在初始化的时候会初始化ostream。
    上面那句相当于
    operator<<(ostream,"Hello!" );
    ostream.operator<<(pFunc)
    {
    pFunc->(this);
    }
    这里的pFunc是std::endl函数。为输出缓存添加"\0"
    对于等价API好像有3个
    printf等
    具体可以看Exceptional C++ style,里面好像有相关介绍。
    2009年4月10日 9:28
    版主
  • 我补充说一下,就是说这个std::cout<<"Hello!"<<std::endl;的实际效果就是在控制台窗口中打印一条 Hello!然后回车。我的意思就是,如果我只用Windows提供的API来达到同样的效果的话,我应该怎么调用API,我记得好象是先要有一个getstdhandle吧!然后接下来应该是writeconcole函数,那我看了MSDN里面,发现writeconcole函数好象有好几个,我不知道该调用哪一个。
    凝气神通
    2009年4月10日 15:35
  • 首先用 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
    2009年4月22日 12:40