1

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

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

3 回答 3

0

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

LINK.exe /EDIT /SUBSYSTEM:CONSOLE {你的 exe 名称在这里}

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

于 2014-02-27T22:35:08.177 回答
0

我解决了。

重定向标准输出时出错,当它应该让它保持原样时,它做错了什么。还不知道。我会更新我的答案。

于 2013-03-20T22:38:11.207 回答
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;
}

现在,如果出现问题,我们不仅会知道,还会知道原因

好东西,因为当我在我的计算机上运行这段代码时,它工作得很好。因此,问题出在您的应用程序的其他地方,在一些我们没有看到的代码中。错误处理代码将有助于清除它。

于 2013-03-20T22:38:20.273 回答