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

4

我正在为我们的产品编写一个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的明确迹象。

我如何确定子进程是将其stdout管道写入为CHAR还是WCHAR?

2个回答

4

归根结底,没有一种100%可靠的方法来做到这一点。进程的输入/输出句柄不是特定的编码。它们只是处理一系列字节的流。一个进程完全可以先写ASCII字符,然后转而写Unicode字符。

不幸的是,从一系列字节中无法以100%的准确度确定底层编码方式。唯一确定它的方法是通过握手协议,让进程告诉你它将要使用的编码方式。在这种情况下,可能不是一个选项。

有关此主题的链接


1

我认为你连接时必须进行协商。你可以使用 PeekNamedPipe() 并根据其是否类似于 Unicode 字符来猜测。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接