Win32:确定stdout句柄是char还是wchar流

时间:2009-03-10 22:53:30

标签: winapi char pipe wchar-t

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

2 个答案:

答案 0 :(得分:3)

底线是没有100%可靠的方法来做到这一点。进程的输入/输出句柄不是特定于编码的。它们只是在一个字节流上运行。一个进程完全有可能暂时写入ASCII并稍后切换到Unicode。

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

关于这个主题的链接

答案 1 :(得分:1)

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