Черт возьми, это так странно, я не знаю, что сказать. Короткая версия состоит в том, что у меня есть приложение-симулятор, которое я порождаю из своего приложения, когда пользователь просит меня об этом. Недавно он перестал работать, хотя я могу нормально запустить симулятор из командной строки или меню Пуск. Это может быть связано с переходом на VS2010 или Windows 7 или чем-то, чего я не заметил при просмотре различий в управлении исходным кодом.
У меня есть второй симулятор, который я пытаюсь создать таким же образом, и он отлично работает.
По умолчанию я использую оболочку QProcess Qt3 для CreateProcess для этой цели, но я получаю то же поведение, используя system, мой собственный CreateProcess и ShellExecute.
ShellExecute из cmd.exe "/ c application params", однако, предоставляет мне дополнительную информацию. Я получаю диалог
"Программа не может запуститься, потому что MSVCR80.dll отсутствует на вашем компьютере. Попробуйте переустановить программу, чтобы решить эту проблему."
Неудобно, и родительское приложение, и второй симулятор используют MSVCR80.dll.
После копирования MSVC * 80.dll из g: \ windows \ winsxs \ x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4927_none_d08a205e442db5b5 в тот же каталог, что и мой исполняемый файл, сообщение об ошибке меняется на
"Ошибка выполнения!
Программа: g: \ path \ to \ app.exe
R6034
Приложение попыталось загрузить библиотеку времени выполнения C неправильно.
Пожалуйста, обратитесь в службу поддержки приложения для получения дополнительной информации.
Затем следует
Приложение не удалось правильно запустить (0xc0000142). Нажмите кнопку ОК, чтобы закрыть приложение.
И, опять же, приложение работает нормально из командной строки с этими DLL-файлами на месте.
Обновление:
Я подозревал, что, возможно, это связано со средой, поэтому изменил мой механизм ShellExecute, чтобы он устанавливал параметры cmd / c && app. Я установил cmd.exe с теми же параметрами, и мое приложение теперь падает так же. Обновлюсь, когда выясню почему:
Это инструмент времени выполнения компонента MATLAB, который изменяет переменную PATH моего процесса на плохой эффект. Он готовит свой собственный каталог, полный DLL и хаос.