gpt4 book ai didi

winapi - Win32 : Determine whether stdout handle is char or wchar stream

转载 作者:行者123 更新时间:2023-12-01 13:08:55 25 4
gpt4 key购买 nike

我正在为我们的产品编写一个 win32 实用函数,它需要通过 shell 调用任意程序并记录其输出。我们通过将子进程的 stdout 重定向到一个管道来做到这一点:

    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% 准确地从字节流中分辨出底层编码是什么。确定这一点的唯一方法是有一个握手协议(protocol),其中进程会告诉您它将使用什么编码。在这种情况下可能不是一个选择。

主题链接

关于winapi - Win32 : Determine whether stdout handle is char or wchar stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/632611/

25 4 0