WriteFile到标准输出失败

时间:2013-03-20 22:00:15

标签: c winapi

我想写一个随机输出,其中STD_OUTPUT_FILE可以。我想用 WriteFile,但它似乎没有写任何东西。

HANDLE outH = GetStdHandle ( STD_OUTPUT_HANDLE );
WriteFile( outH,param, strlen ( param ), &written_b, NULL );

3 个答案:

答案 0 :(得分:0)

我解决了。

重定向标准输出时出现错误,当它应该让它成为现实时,它出错了。还不知道。我会更新我的答案。

答案 1 :(得分:0)

您的代码缺少任何形式的错误检查。这对于从网站或Stack Overflow应答复制的代码很常见,为了清楚和简洁,通常省略错误检查。但是每当你自己编写代码时,你绝对必须假设它可能会失败并编写代码来处理这种情况。在这里,您知道它失败了,您仍然没有返回添加错误检查代码以查看失败发生的位置。

现在让我们添加错误检查代码,必要时参考SDK文档,看看你调用的API函数如何处理错误条件:

static void ReportError(const TCHAR* errorMsg)
{
   MessageBox(NULL, errorMsg, NULL, MB_OK | MB_ICONERROR);
}

int _tmain(int argc, TCHAR* argv[])
{
   char param[] = "This is some output.";
   DWORD written_b;

   HANDLE outH = GetStdHandle(STD_OUTPUT_HANDLE);
   if (!outH)
   {
      ReportError(TEXT("No standard handles associated with this app."));
   }
   else if (outH == INVALID_HANDLE_VALUE)
   {
      TCHAR errMsg[100];
      wsprintf(errMsg, TEXT("GetStdHandle() failed with error code %lu"), GetLastError());
      ReportError(errMsg);
   }
   else
   {
      if (!WriteFile(outH, param, strlen(param), &written_b, NULL))
      {
         TCHAR errMsg[100];
         wsprintf(errMsg, TEXT("WriteFile() failed with error code %lu"), GetLastError());
         ReportError(errMsg);
      }
   }

   return 0;
}

现在,如果出现问题,我们不仅会知道,而且我们会知道为什么

好的,因为当我在计算机上运行此代码时,它运行得很好。因此,问题在于您的应用程序中我们未见过的一些代码。错误处理代码将帮助将其清除。

答案 2 :(得分:0)

要使用调用窗口/控制台写入STDOUT,您需要将生成的可执行文件链接到控制台子系统。

LINK.exe / EDIT / SUBSYSTEM:CONSOLE {您的exe名称}

这适用于较旧的VB6环境,我假设同样的可执行标志也适用于Visual C.