Здравствуйте, sz36, Вы писали:
S>Есть приложение, написанное несколько лет назад, которое в процессе работы запускает консольную утилиту стороннего производителя следующим кодом:
| Скрытый текст |
| S>S> SECURITY_ATTRIBUTES sa;
S> memset(&sa, 0, sizeof(SECURITY_ATTRIBUTES));
S> sa.nLength = sizeof(sa);
S> sa.bInheritHandle = TRUE;
S> sa.lpSecurityDescriptor = NULL;
S> HANDLE hFile = CreateFile(TmpFile.c_str(), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, &sa, OPEN_ALWAYS, 0, NULL);
S> STARTUPINFO Si;
S> memset(&Si, 0, sizeof(STARTUPINFO));
S> Si.cb = sizeof(STARTUPINFO);
S> Si.hStdOutput = hFile;
S> Si.hStdError = hFile;
S> Si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
S> Si.wShowWindow = SW_HIDE;
S> _PROCESS_INFORMATION p = {0};
S> bool Res = CreateProcess(NULL, CmdLine.c_str(), NULL, NULL, TRUE, CREATE_DEFAULT_ERROR_MODE, NULL, Dir.c_str(), &Si, &p);
S> if(!Res) throw Exception(String("Ошибка запуска "+CmdLine));
S> WaitForSingleObject(p.hProcess, INFINITE);
S> CloseHandle(hFile);
S>
|
| |
S>Содержимое TmpFile дальше парсится, там ничего интересного. Приложение прекрасно работало до недавнего времени, а потом перестало, то ли от обновления Windows, то ли от обновления этой сторонней утилиты (из Atmel Studio). Причем падает эта самая утилита, в TmpFile выводится такое:
S>S>[ERROR] An unexpected error occurred when executing.
S>Traceback (most recent call last):
S> File "atmel\atprogram.py", line 48, in run
S> File "atmel\avr\cli\commandline.py", line 54, in execute_commands
S> File "atmel\avr\cli\commandexecutor.py", line 52, in execute_commands
S> File "atmel\avr\cli\resourcemanager.py", line 44, in prepare_resources
S> File "atmel\avr\cli\resourcemanager.py", line 51, in _prepare_resource
S> File "atmel\avr\cli\resourcecontainers.py", line 54, in allocate
S> File "atmel\avr\cli\backend.py", line 134, in start
S> File "subprocess.py", line 702, in __init__
S> File "subprocess.py", line 823, in _get_handles
S>WindowsError: [Error 6]
Правильно я понимаю, что atprogram.py не посмотреть (исходников нет)?
Ошибка 6 это ERROR_INVALID_HANDLE, вероятно проблема связана с редиректом вывода в файл.
S>Воспроизводится, по крайней мере, на нескольких компах. Все бы ничего, можно было подумать, что накосячили в Atmel Studio, но я останавливаюсь отладчиком на вызове CreateProcess, копирую CmdLine из окна Watch, запускаю вручную из консоли, из той же самой рабочей директории (Dir) и оно прекрасно работает! Что я делаю не так, чем мой программный вызов отличается от вызова вручную?
При вызове вручную происходит перенаправление stdout и stderr (> file.tmp 2>&1)?
А если CreateProcess'ом запустить cmd.exe /c "<CmdLine> > file.tmp 2>&1" (т.е. тоже с перенаправлением вывода) — падает?