Передача команд с 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 из моей программы. Я пишу эту программу для автоматизации работы с командной строкой.