Win32:确定 stdout 句柄是 char 还是 wchar 流
题
我正在为我们的产品编写一个 win32 实用函数,该函数需要通过 shell 调用任意程序并记录其输出。我们通过将子进程的标准输出重定向到管道来做到这一点:
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
CreatePipe(&hReadPipe, &hWritePipe, &saAttr, 0);
// Redirect the first process stdout to our write pipe
// so that we can read its output from the read pipe.
startUpInfo.dwFlags = STARTF_USESTDHANDLES;
startUpInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
startUpInfo.hStdOutput = hWritePipe;
startUpInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
CreateProcessA(NULL, szCmdLine, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &startUpInfo[i], &procInfo);
有多种程序可以通过这种方式调用,其中许多程序不受我们的控制。目前,我们遇到一个问题,许多程序的输出似乎在第一个字符之后被截断——这通常是 WCHAR 字符串被错误地用作 CHAR 的明确标志。
如何判断子进程是否以 CHAR 或 WCHAR 形式写入其标准输出管道?
解决方案
最重要的是,没有 100% 可靠的方法可以做到这一点。进程的输入/输出句柄不是特定于编码的。它们只是对字节流进行操作。进程完全有可能暂时写入 ASCII,然后再切换到 Unicode。
不幸的是,不可能从字节流中 100% 准确地判断底层编码是什么。确定这一点的唯一方法是采用握手协议,其中该过程会告诉您它将使用什么编码。在这种情况下可能不是一个选择。
有关该主题的链接
其他提示
我认为你必须在连接时协商。您可以使用 PeekNamedPipe()并基于猜测如果它看起来像一个unicode角色...
不隶属于 StackOverflow