ADN Open CIS
Сообщество программистов Autodesk в СНГ

09/06/2015

Почему не загружается в AutoCAD мой ARX-файл и как с этим бороться?

Причин по которым arx-файл не загружается в AutoCAD может быть много. В этом случае обычно выдаётся сообщение типа:
AcRxDynamicLinker failed to load ”....\myArxFile.arx”.....

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, и искать в нём сообщение об ошибке. Это оказалось не сложно:

Код - Registry: [Выделить]
  1. ИНФОРМАЦИЯ: анализируется файл манифеста ...\myArxFile.arx.
  2.  
  3.  ИНФОРМАЦИЯ: удостоверение определения манифеста: (null)
  4.  
  5.  ИНФОРМАЦИЯ: ссылка: Microsoft.VC80.CRT, processorArchitecture="amd64", publicKeyToken="1fc8b3b9a1e18e3b", type="win32", version="8.0.50727.6195"
  6.  
  7. ИНФОРМАЦИЯ: выполняется разрешение ссылки Microsoft.VC80.CRT,processorArchitecture="amd64", publicKeyToken="1fc8b3b9a1e18e3b", type="win32", version="8.0.50727.6195".
  8.  
  9.  ИНФОРМАЦИЯ: выполняется разрешение ссылки для ProcessorArchitecture amd64.
  10.  
  11.   ИНФОРМАЦИЯ: выполняется разрешение ссылки для культуры Neutral.
  12.  
  13.    ИНФОРМАЦИЯ: выполняется применение политики связывания.
  14.  
  15.     ИНФОРМАЦИЯ: выполняется поиск политики издателя на C:\Windows\WinSxS\manifests\amd64_policy.8.0.microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4940_none_09c03a53facd313f.manifest.
  16.  
  17.     ИНФОРМАЦИЯ: не удалось найти перенаправление политики связывания.
  18.  
  19.    ИНФОРМАЦИЯ: начинается проверка сборки.
  20.  
  21.     ИНФОРМАЦИЯ: не удалось найти сборку в WinSxS.
  22.  
  23.     ИНФОРМАЦИЯ: попытка проверки манифеста на C:\Windows\assembly\GAC_64\Microsoft.VC80.CRT\8.0.50727.6195__1fc8b3b9a1e18e3b\Microsoft.VC80.CRT.DLL.
  24.  
  25.     ИНФОРМАЦИЯ: попытка проверки манифеста на c:\program files\csoft\model studio cs\cable\bin\2015\Microsoft.VC80.CRT.DLL.
  26.  
  27.     ИНФОРМАЦИЯ: попытка проверки манифеста на c:\program files\csoft\model studio cs\cable\bin\2015\Microsoft.VC80.CRT.MANIFEST.
  28.  
  29.     ИНФОРМАЦИЯ: попытка проверки манифеста на c:\program files\csoft\model studio cs\cable\bin\2015\Microsoft.VC80.CRT\Microsoft.VC80.CRT.DLL.
  30.  
  31.     ИНФОРМАЦИЯ: попытка проверки манифеста на c:\program files\csoft\model studio cs\cable\bin\2015\Microsoft.VC80.CRT\Microsoft.VC80.CRT.MANIFEST.
  32.  
  33.     ИНФОРМАЦИЯ: не удалось найти манифест для культуры Neutral.
  34.  
  35.    ИНФОРМАЦИЯ: проверка сборки завершена.
  36.  
  37.  Ошибка: не удается разрешить ссылку Microsoft.VC80.CRT, processorArchitecture="amd64", publicKeyToken="1fc8b3b9a1e18e3b", type="win32", version="8.0.50727.6195".
  38.  
  39. ИНФОРМАЦИЯ: не удалось создать контекст активации.
  40.  
  41. Создание контекста активации завершено.


Дальнейшее уже было делом техники. Поиск в 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