使用 WinAPI WriteConsole 的控制台输出

标签 c winapi console

我正在尝试使用 winapi 函数做 hello world。它有点工作,但我很乐意以正确的方式完成它。

所以我得到了这样的代码:

int main(){
    HANDLE std_out;
    int i;
    char *error_msg;

    std_out = GetStdHandle(STD_OUTPUT_HANDLE);

    if(std_out == INVALID_HANDLE_VALUE){
        MessageBox(NULL,"stdout not available","Error",MB_OK);
        return 1;
    }

    AttachConsole(ATTACH_PARENT_PROCESS);

    if(!WriteConsoleA(std_out,"hhh\n",4,&i,NULL)){
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,NULL,GetLastError(),0,&error_msg,4,NULL);
        MessageBox(NULL,error_msg,"Error",MB_OK);
    }

    return 42;
}

我也在做一些实验,所以我链接到/entry:main/subsystem:windows

输出如下:

%PATH_TO_WORKING_DIR%>hhh(CRLF)

然后它一直等到我按下 RETURN,然后程序终止,您可能同意这是非常糟糕的“hello world”。非常欢迎任何关于如何摆脱 PWD 和按回车键的想法,感谢阅读。

最佳答案

这是一个 GUI 应用程序,您强制使其像控制台应用程序一样运行。我猜 cmd.exe(或任何父级)感到困惑,因为你们都认为你们“拥有”stdout。

与/SUBSYSTEM:CONSOLE 链接,问题应该消失(然后您不需要/ENTRY 或调用 AttachConsole)

如果您确实想要 GUI/控制台混合,则需要在没有控制台时调用 AllocConsole(从资源管理器等启动)

关于使用 WinAPI WriteConsole 的控制台输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9794764/

相关文章:

c - 使用 mmap 就地反转文本文件——出现总线错误

C 字符串文字所需的转义字符

c++ - RegQueryValueEx 不返回值的数据

c++ - 如何获得 Windows 线程的返回值?

eclipse - (Eclipse) 如何与控制台 View 交互?

c - system() 调用在 C 中返回错误值

c++ - MessageBox 和 ShellExecute 成功,但如果在应用程序退出之前立即调用则不会显示任何内容

linux - 如何使用 linux 控制台在图像中搜索子图像?

ruby-on-rails-3 - Rails 控制台——输出查询结果表

c - 这个递归的例子正确吗?