Сломался CreateProcess
От: sz36 Россия  
Дата: 11.09.18 00:50
Оценка:
Hi, All!

Есть приложение, написанное несколько лет назад, которое в процессе работы запускает консольную утилиту стороннего производителя следующим кодом:
  SECURITY_ATTRIBUTES sa;
  memset(&sa, 0, sizeof(SECURITY_ATTRIBUTES));
  sa.nLength = sizeof(sa);
  sa.bInheritHandle = TRUE;
  sa.lpSecurityDescriptor = NULL;

  HANDLE hFile = CreateFile(TmpFile.c_str(), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, &sa, OPEN_ALWAYS, 0, NULL);

  STARTUPINFO Si;
  memset(&Si, 0, sizeof(STARTUPINFO));
  Si.cb = sizeof(STARTUPINFO);
  Si.hStdOutput = hFile;
  Si.hStdError = hFile;
  Si.dwFlags    = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
  Si.wShowWindow = SW_HIDE;

  _PROCESS_INFORMATION p = {0};
  bool Res = CreateProcess(NULL, CmdLine.c_str(), NULL, NULL, TRUE, CREATE_DEFAULT_ERROR_MODE, NULL, Dir.c_str(), &Si, &p);
  if(!Res) throw Exception(String("Ошибка запуска "+CmdLine));
  WaitForSingleObject(p.hProcess, INFINITE);
  CloseHandle(hFile);


Содержимое TmpFile дальше парсится, там ничего интересного. Приложение прекрасно работало до недавнего времени, а потом перестало, то ли от обновления Windows, то ли от обновления этой сторонней утилиты (из Atmel Studio). Причем падает эта самая утилита, в TmpFile выводится такое:

[ERROR] An unexpected error occurred when executing.
Traceback (most recent call last):
File "atmel\atprogram.py", line 48, in run
File "atmel\avr\cli\commandline.py", line 54, in execute_commands
File "atmel\avr\cli\commandexecutor.py", line 52, in execute_commands
File "atmel\avr\cli\resourcemanager.py", line 44, in prepare_resources
File "atmel\avr\cli\resourcemanager.py", line 51, in _prepare_resource
File "atmel\avr\cli\resourcecontainers.py", line 54, in allocate
File "atmel\avr\cli\backend.py", line 134, in start
File "subprocess.py", line 702, in __init__
File "subprocess.py", line 823, in _get_handles
WindowsError: [Error 6]


Воспроизводится, по крайней мере, на нескольких компах. Все бы ничего, можно было подумать, что накосячили в Atmel Studio, но я останавливаюсь отладчиком на вызове CreateProcess, копирую CmdLine из окна Watch, запускаю вручную из консоли, из той же самой рабочей директории (Dir) и оно прекрасно работает! Что я делаю не так, чем мой программный вызов отличается от вызова вручную?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.