Re: Сломался CreateProcess
От: EreTIk EreTIk's Box
Дата: 11.09.18 07:08
Оценка: 2 (1)
Здравствуйте, 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" (т.е. тоже с перенаправлением вывода) — падает?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.