Передача команд с UTF-16 символами для исполнения в терминале через канал

Моя программа создает окно терминала и посылает в него команды через канал. Проблема в том что мне нужно посылать команды в терминал с UTF-16 символами. Вот пример моего кода:

void Terminal::createProcessCMD(const std::wstring& path)
{

    STARTUPINFOW PSTARTUPINFO;
    PROCESS_INFORMATION PPROCESSINFO;
    SECURITY_ATTRIBUTES SECURITYATTR;

    SECURITYATTR.nLength = sizeof(SECURITY_ATTRIBUTES);
    SECURITYATTR.bInheritHandle = TRUE;
    SECURITYATTR.lpSecurityDescriptor = NULL;

    CreatePipe(&CMD_READ, &PARENT_WRITE, &SECURITYATTR, 0);

    ZeroMemory(&PSTARTUPINFO, sizeof(STARTUPINFO));

    PSTARTUPINFO.cb = sizeof(STARTUPINFO);
    PSTARTUPINFO.hStdInput = CMD_READ;
    PSTARTUPINFO.dwFlags |= STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
    PSTARTUPINFO.wShowWindow = SW_SHOWNORMAL;
    BOOL success = CreateProcessW(path.c_str(),
        NULL,
        NULL,
        NULL,
        TRUE,
        CREATE_NEW_CONSOLE,
        NULL,
        NULL,
        &PSTARTUPINFO,
        &PPROCESSINFO);

}
void Terminal::sendCommandToCMD(const std::wstring& command)
{
    DWORD bytesToWrite = static_cast<DWORD>((command.size() + 1) * sizeof(wchar_t));
    DWORD bytesWritten = 0;
    WriteFile(PARENT_WRITE, command.c_str(), bytesToWrite, &bytesWritten, NULL);
} 
int main()
{
terminal.createPrecessCMD(L"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe");
terminal.sendCommandToCMD(L"cd \'C:\\Users\\Forty\'");
}

Данные в канал записываются правильно. Такую ошибку выдает терминал при попытке выполнить команду:

PS C:\Users\Forty\AppData\Roaming\TerminalsThisWay> cd 'C:\Users\Forty'
 : Имя "" не распознано как имя командлета, функции, файла сценария или выполняемой программы. Проверьте правильность
 написания имени, а также наличие и правильность пути, после чего повторите попытку.
строка:1 знак:1
+ cd 'C:\Users\Forty'
+ ~
    + CategoryInfo          : ObjectNotFound: (:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Вот что буде если писать без завершающего нуля:

PS C:\Users\Forty\AppData\Roaming\TerminalsThisWay> cd 'C:\Users\Forty'
 : Имя "с" не распознано как имя командлета, функции, файла сценария или выполняемой программы. Проверьте правильность
 написания имени, а также наличие и правильность пути, после чего повторите попытку.
строка:1 знак:1
+ cd 'C:\Users\Forty'
+ ~
    + CategoryInfo          : ObjectNotFound: (:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Я знаю, что это будет работать, если я подам в терминал символы ANSI, но мне нужно подать на терминал команды, которые могут содержать китайские символы и другие символы, отличные от тех, что в кодировке ANSI. Я знаю, что стандартный терминал может принимать символы в кодировке UTF-16. Я не могу понять, что мне нужно сделать, чтобы терминал принимал символы UTF-16 из моей программы. Я пишу эту программу для автоматизации работы с командной строкой.


Ответы (0 шт):