3

我正在为我们的产品编写一个 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 写入其 stdout 管道?

4

2 回答 2

3

底线是没有 100% 可靠的方法来做到这一点。进程的输入/输出句柄不是特定于编码的。它们只是对字节流进行操作。一个进程完全有可能先写一段 ASCII,然后再切换到 Unicode。

不幸的是,不可能以 100% 的准确率从字节流中分辨出底层编码是什么。确定这一点的唯一方法是有一个握手协议,该过程会告诉您它将使用什么编码。在这种情况下可能不是一个选择。

关于主题的链接

于 2009-03-11T00:03:46.020 回答
1

我认为您必须在连接时进行协商。您可以使用PeekNamedPipe()并根据它是否看起来像 unicode 字符进行猜测...

于 2009-03-10T23:05:16.050 回答