【问题标题】:Win32: Determine whether stdout handle is char or wchar streamWin32:判断stdout句柄是char还是wchar流
【发布时间】:2010-10-12 13:38:44
【问题描述】:

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

【问题讨论】:

    标签: winapi char pipe wchar-t


    【解决方案1】:

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

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

    关于该主题的链接

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-16
        • 1970-01-01
        • 2019-01-29
        • 1970-01-01
        • 2013-03-21
        • 1970-01-01
        • 1970-01-01
        • 2021-11-30
        相关资源
        最近更新 更多