我正在为我们的产品编写一个 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角色...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top