Cmd.exe выводит внешние команды Unicode - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь получить вывод Unicode при выполнении команд cmd.exe.Я вижу, что ключ / U работает только для встроенных команд, таких как dir, а не для других, таких как ipconfig.

Если я изменю имя моего компьютера на имя, похожее на китайский / русский / японский язык, и запустлю ipconfig / all, то онобудет отображаться в консоли просто отлично.Но когда я использую CreateProcesssW () и перенаправляю свой вывод в канал, он не возвращает мне юникод, даже если он правильно отображает его на консоли.

#include <Windows.h>
#include <stdio.h>
int main() {
    HANDLE hPipeRead, hPipeWrite;

    SECURITY_ATTRIBUTES saAttr = { sizeof(SECURITY_ATTRIBUTES) };
    saAttr.bInheritHandle = TRUE;
    saAttr.lpSecurityDescriptor = NULL;

    if (!CreatePipe(&hPipeRead, &hPipeWrite, &saAttr, 0))
        return 0;

    STARTUPINFO si = { sizeof(STARTUPINFO) };
    si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    si.hStdOutput = hPipeWrite;
    si.hStdError = hPipeWrite;
    si.wShowWindow = SW_HIDE;

    PROCESS_INFORMATION pi = { 0 };

    WCHAR works[] = L"C:\\windows\\system32\\cmd.exe /u /c dir C:\\test";
    WCHAR dont[] = L"cmd.exe /u /c ipconfig";

    BOOL fSuccess = CreateProcessW(NULL, works, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
    if (!fSuccess) {
        CloseHandle(hPipeWrite);
        CloseHandle(hPipeRead);
        return 0;
    }

    BOOL bProcessEnded = FALSE;
    for (; !bProcessEnded;) {

        bProcessEnded = WaitForSingleObject(pi.hProcess, 50) == WAIT_OBJECT_0;

        while (TRUE) {
            CHAR *buf = NULL;
            DWORD dwRead = 0;
            DWORD dwAvail = 0;

            if (!PeekNamedPipe(hPipeRead, NULL, 0, NULL, &dwAvail, NULL))
                break;

            if (!dwAvail)
                break;
            buf = HeapAlloc(GetProcessHeap(), 0, dwAvail);
            if (buf == NULL) {
                return 0;
            }

            if (!ReadFile(hPipeRead, buf, dwAvail, &dwRead, NULL) || !dwRead)
                break;
            printf("%ls", buf);

        }
    }

    CloseHandle(hPipeWrite);
    CloseHandle(hPipeRead);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    Sleep(10000);
    return 0;
}

Я пытаюсь выяснить, какчтобы вернуть юникод от всего запустившегося в cmd.exe.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...