У меня проблемы с записью WString в STDIN дочернего процесса. Если у меня есть только строка символов acii (например: @ WSX3edc), код работает нормально, но если он содержит символ, отличный от ascii (например: @ WSX3edcß), он не работает.
Дочерний процесс - 7zr.exe (версия строки 7Zip cmd). Ввод, который я пишу в STDIN, - это пароль для извлечения файла.
// inject password
wPassword.append(password);
wPassword.append(L"\n"); \\For carriage return
...
DWORD dwBytesToWrite = wPassword.length()*sizeof(wchar_t);
DWORD dwBytesWritten = 0;
char szBuffer[1024] = "\0";
wcstombs(szBuffer, wPassword.c_str(),wcslen(wPassword.c_str())+1);
dwBytesToWrite = strlen(szBuffer);
if (!WriteFile(hInput, szBuffer, dwBytesToWrite, &dwBytesWritten, NULL)) {
std::cout<<"write file failed"<<GetLastError()<<std::endl;
goto Cleanup;
}
Запись файла всегда выполняется успешно, но иногда извлечение файла не удается из-за неисправного механизма ввода пароля.
Createprocess для этого выглядит так: (объект si имеет потоки STDIN и STDOUT, установленные ранее с помощью CreatePipe)
if(!CreateProcess((LPWSTR)cmd, (LPWSTR)cmdArgs, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS,
NULL, NULL, &si, &pi)) {
std::cout<<"7zr.exe process creation failed "<<GetLastError()<<std::endl;
goto Cleanup;
}
Примечание. 7zr.exe отлично работает с этим паролем, если мы запустим его из командной строки и вставим этот пароль. Добыча работает нормально.