среда, 7 августа 2013 г.

VS 2008 SP1: Error result 1 returned from 'C:\Windows\system32\cmd.exe'.

Дабы иметь возможность писать плагины под AutoCAD не только на .NET, но и на C++, мне пришлось установить на компьютер сразу несколько версий IDE, т.к. каждой версии AutoCAD соответствует своя версия MS Visual Studio. Поскольку мои юзеры в большинстве своём используют AutoCAD 2009, то и установить пришлось версии, начиная с 2005-й, т.е.: 2005, 2008, 2010 и 2012. Для начала пришлось снести уже установленную версию VS 2012, дабы избежать проблем при установке, после чего установил все версии в порядке старшинства, начиная с самой древней и заканчивая наиболее свежей. Всё установилось без проблем. Однако, в процессе написания  на C++ тестового "Hello World", при сборке проекта в среде VS 2008 SP1, вылезли неожиданные подводные камни (в MS VS 2010 подобных проблем не возникло). Вот об этом собственно и собираюсь написать.

Результатом сборки проекта было следующее сообщение:

Error result 1 returned from 'C:\Windows\system32\cmd.exe'.

При этом целевой exe файл был всё же создан. Попытка его запуска приводила к появлению диалогового окна с сообщением об ошибке:

The program can't start because MSVCP90D.dll is missing from your computer. Try reinstalling the program to fix this problem.

Это несколько странно, т.к. файл MSVCP90D.dll на самом деле присутствует в следующих каталогах:
  • C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugCRT
  • C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\amd64\Microsoft.VC90.DebugCRT
Для того, чтобы снять проблему с DLL файлом, я решил для начала пойти по пути наименьшего сопротивления - внести соответствующие изменения в настройках проекта: свойству C/C++->Code Generation->Runtime Library задал значение Multi-threaded Debug (/MTd) вместо Multi-threaded Debug DLL (/MDd). Это приведёт к тому, что функционал библиотеки будет включён в состав exe файла, вызвав его раздувание - не самое лучшее решение, но позднее, разобравшись с проблемой, изменённую опцию можно будет вернуть на место.

В результате, сообщение об ошибке с cmd.exe осталось на месте, но теперь полученный exe файл успешно собирался и работал. Оставалось разобраться с проблемой, возникавшей при работе cmd.exe

Небольшое отступление... Дело в том, что время от времени я пишу программный код в текстовом редакторе Notepad++, компилируя его из консоли MS VS, ярлык вызова которой у меня закреплён в панели задач Windows (привык: удобно, быстро, да и память тренирует). Поскольку все мои проекты находятся в определённом подкаталоге, то для того, чтобы каждый раз не начинать свою работу в консоли с выполнения команды перехода в нужный каталог, указывая его полное имя, я когда-то в ветку HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor добавил ключ AutoRun, в качестве значения которого и указал нужную мне команду: cd "c:\projects".  До сих пор это не вызывало никаких осложнений.

Оказалось, что VS 2008 в процессе своей работы, вызывая команду cmd.exe, не учитывает возможность наличия в реестре ключа AutoRun, в котором может быть выполнена замена текущего каталога, из-за чего и возникают проблемы. Более новая версия (MS VS 2010) не имеет подобных проблем. Если обозначенный ключ удалить или переименовать, то проблема сразу исчезает: всё успешно компилируется и работает. Кроме того, вернув свойству C/C++->Code Generation->Runtime Library прежнее значение (Multi-threaded Debug DLL (/MDd)) и перекомпилировав проект, увидим, что exe по прежнему работает корректно, не выдавая более сообщений о не найденном файле MSVCP90D.dll.

Комментариев нет: