【问题标题】:Console output with WinAPI WriteConsole使用 WinAPI WriteConsole 的控制台输出
【发布时间】:2012-04-05 09:21:44
【问题描述】:

我正在尝试使用 winapi 函数打招呼。这有点工作,但我希望以正确的方式完成它。

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

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 和按下返回键的想法,谢谢阅读。

【问题讨论】:

  • 您可能想了解main 的返回值约定。
  • 您将需要使用 start.exe /wait yourapp.exe 来启动您的程序,调用 AllocConsole 而不是 AttachConsole 或将子系统设置为控制台。
  • @MikeKwan:这不是这里的问题。

标签: c winapi console


【解决方案1】:

这是一个 GUI 应用程序,您可以强制它像控制台应用程序一样工作。我猜 cmd.exe(或任何父级)会感到困惑,因为你们都认为自己“拥有”标准输出。

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

如果你真的想要一个 GUI/Console 混合,你需要在没有控制台时调用 AllocConsole(从资源管理器等开始)

【讨论】:

  • 您也可以通过使用 /SUBSYSTEM:CONSOLECreateWindow 来获得 GUI/控制台混合。
  • 是的,实际上我应该说我不想要任何 libc,我想自己设置它。但无论它现在如何工作,更改子系统都有帮助,但我的条目仍然保留:)。无论如何,您提到了一些我无法像在代码中那样管理标准输出的方式,我是否遗漏了什么/做错了什么? AllocConsole,试过了,效果很好,很酷的功能:),谢谢
  • main 不是 Windows 上的真正入口点,对于控制台应用程序,在使用 MS 工具链时名称为 mainCRTStartup(参见 microsoft.com/msj/archive/S569.aspx
猜你喜欢
  • 2014-04-29
  • 2021-05-11
  • 1970-01-01
  • 2011-08-18
  • 2014-08-29
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多