Почему не загружается в AutoCAD мой ARX-файл и как с этим бороться?
Причин по которым arx-файл не загружается в AutoCAD может быть много. В этом случае обычно выдаётся сообщение типа:C:\Program Files\Autodesk\AutoCAD 2015\acad.exe
can't load the myArxFile.arx file。
Или:
“....\myArxFile.arx” не является корректным ARX-файлом.
Сбой AcRxDynamicLinker при загрузке .”...\myArxFile.arx”
C:\Program Files\Autodesk\AutoCAD 2015\acad.exe
Module ”...\myArxFile.arx” failed to load.
Рассмотрим причины, по которым это может происходить:
- arx-файл создан не для этой версии AutoCAD (использовалась не та версия ObjectARX SDK)
- arx-файл создан с использованием не той версии Visual Studio (например VS 2013 вместо VS 2012 Update 4)
- arx-файл создан не для той разрядности AutoCAD (например, arx-файл 32-разрядный, а AutoCAD 64-разрядный или наоборот).
- Сбой в DllMain arx-файла. Т.к. arx-файл – это в конечном итоге dll-файл, то для корректной его инициализации необходимо «чистое» выполнение функции DllMain. Для начала удалите из него всё лишнее.
- Нет следующих функций в таблице экспорта arx-файла:
acrxEntryPoint
acrxGetApiVersion
- Функция acrxEntryPoint при получении сообщения AcRx::AppMsgCode равного kInitAppMsg (или метод On_kInitAppMsg класса, производного от AcRxDbxApp) возвращает не AcRx::kRetOK
- В таблице импорта присутствуют exe/dll/arx/dbx/crx-файлы, путь к которым не может быть найден AutoCAD’ом.
- В таблице импорта присутствуют ненайденные во внешних exe/dll/arx/dbx/cr-файлах функции. Возможно, таких функций нет, возможно изменилось их определение и соответственно декорированное (mangled) имя.
Для поиска отсутствующих модулей и функций в них лучше всего использовать depends.exe (входит в состав Visual Studio и может быть скачан с сайта http://www.dependencywalker.com/
Не забываем ему указывать пути к acad.exe и "%ProgramFiles%\Common Files\Autodesk Shared"
- В манифесте arx-фала содержится ссылка на модуль, которого нет в системе. Это самая интересная и самая сложная для поиска ошибки причина.
Постараемся с ней разобраться на конкретном примере. Передо мной стояла задача выяснить почему один и тот же arx-файл в одинаковых (казалось бы) системах Windows и AutoCAD в одном случае загружается, а в другом нет. Модуль достаточно сложный и имеющий зависимости от десятков arx/dbx/dll/exe-файлов
После того, как все вышеперечисленные причины были рассмотрены и отвергнуты, я обратил внимание на сообщение depends.exe
Side by Side Configuration Incorrect ….
В этом сообщении не указывалось конкретно с каким из модулей возникла проблема. Так что пришлось воспользоваться утилитой sxstrace.exe
Для этого я:
- запустил AutoCAD на том компьютере, на котором мой arx-файл не загружается
- запустил sxstrace.exe (от имени Администратора – это важно!)
sxstrace.exe Trace -logfile:C:\MySxSTrace.log
- попытался загрузить свой arx-файл
- завершил работу sxstrace.exe, нажав ENTER
- снова запустил sxstrace.exe (от имени Администратора – это важно!)
sxstrace.exe Parse -logfile:C:\MySxSTrace.log -outfile:C:\MySxSTrace.txt
- Начал анализировать полученный MySxSTrace.txt, и искать в нём сообщение об ошибке. Это оказалось не сложно:
- ИНФОРМАЦИЯ: анализируется файл манифеста ...\myArxFile.arx.
- ИНФОРМАЦИЯ: удостоверение определения манифеста: (null)
- ИНФОРМАЦИЯ: ссылка: Microsoft.VC80.CRT, processorArchitecture="amd64", publicKeyToken="1fc8b3b9a1e18e3b", type="win32", version="8.0.50727.6195"
- ИНФОРМАЦИЯ: выполняется разрешение ссылки Microsoft.VC80.CRT,processorArchitecture="amd64", publicKeyToken="1fc8b3b9a1e18e3b", type="win32", version="8.0.50727.6195".
- ИНФОРМАЦИЯ: выполняется разрешение ссылки для ProcessorArchitecture amd64.
- ИНФОРМАЦИЯ: выполняется разрешение ссылки для культуры Neutral.
- ИНФОРМАЦИЯ: выполняется применение политики связывания.
- ИНФОРМАЦИЯ: выполняется поиск политики издателя на C:\Windows\WinSxS\manifests\amd64_policy.8.0.microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4940_none_09c03a53facd313f.manifest.
- ИНФОРМАЦИЯ: не удалось найти перенаправление политики связывания.
- ИНФОРМАЦИЯ: начинается проверка сборки.
- ИНФОРМАЦИЯ: не удалось найти сборку в WinSxS.
- ИНФОРМАЦИЯ: попытка проверки манифеста на C:\Windows\assembly\GAC_64\Microsoft.VC80.CRT\8.0.50727.6195__1fc8b3b9a1e18e3b\Microsoft.VC80.CRT.DLL.
- ИНФОРМАЦИЯ: попытка проверки манифеста на c:\program files\csoft\model studio cs\cable\bin\2015\Microsoft.VC80.CRT.DLL.
- ИНФОРМАЦИЯ: попытка проверки манифеста на c:\program files\csoft\model studio cs\cable\bin\2015\Microsoft.VC80.CRT.MANIFEST.
- ИНФОРМАЦИЯ: попытка проверки манифеста на c:\program files\csoft\model studio cs\cable\bin\2015\Microsoft.VC80.CRT\Microsoft.VC80.CRT.DLL.
- ИНФОРМАЦИЯ: попытка проверки манифеста на c:\program files\csoft\model studio cs\cable\bin\2015\Microsoft.VC80.CRT\Microsoft.VC80.CRT.MANIFEST.
- ИНФОРМАЦИЯ: не удалось найти манифест для культуры Neutral.
- ИНФОРМАЦИЯ: проверка сборки завершена.
- Ошибка: не удается разрешить ссылку Microsoft.VC80.CRT, processorArchitecture="amd64", publicKeyToken="1fc8b3b9a1e18e3b", type="win32", version="8.0.50727.6195".
- ИНФОРМАЦИЯ: не удалось создать контекст активации.
- Создание контекста активации завершено.
Дальнейшее уже было делом техники. Поиск в Google по контекстам "Microsoft.VC80.CRT" и "8.0.50727.6195" к следующему результату. На одной из (казалось бы) идентичных машин был установлен «Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package MFC Security Update» (http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=26347), а на другой – нет. И это несмотря на то, что arx-файл не использовал C++ 2005 Service Pack 1 Redistributable Package, наличие этой информации в манифесте привело к тому, что без этого обновления arx-файл не загружался. Установка этого обновления решила проблему.
Всё вышесказанное в равной мере относится не только к arx-файлам, но и к dbx-файлам, и crx-файлам.
Если вы знаете дополнительные причины, которые препятствуют загрузке arx-файлов – добро пожаловать в обсуждение данной темы.
Обсуждение: http://adn-cis.org/forum/index.php?topic=2780
Опубликовано 09.06.2015Отредактировано 09.06.2015 в 14:36:36