我正在为我们的产品编写一个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写入其stdout管道?
答案 0 :(得分:3)
底线是没有100%可靠的方法来做到这一点。进程的输入/输出句柄不是特定于编码的。它们只是在一个字节流上运行。一个进程完全有可能暂时写入ASCII并稍后切换到Unicode。
不幸的是,无法从100%准确度的字节流中判断出底层编码是什么。确定这一点的唯一方法是使用握手协议,其中进程告诉您它将使用什么编码。在这种情况下可能不是一个选项。
关于这个主题的链接
答案 1 :(得分:1)
我认为你必须在连接时协商。你可以使用PeekNamedPipe()并猜测它是否看起来像一个unicode字符...