Тема: Ошибка: "cannot find a procedure that it needs"

Перестал загружаться .dbx файл. Autocad выдает сообщение "cannot find a procedure that it needs. AcRxDynamicLinker failed to load \...dbx". Странность еще в том, что делаю откат изменений до того времени когда он загружался, но все равно выдается это сообщение. На всех компьютерах, не только на моем. Есть версия этого файла под 2002 и под 2005 Autocad. Не работает только под 2005.

Re: Ошибка: "cannot find a procedure that it needs"

Посмотри список функций, который экспортирует этот dbx-файл (dumpbin /exports имя_файла.dbx). Обязательно должны быть:

acrxEntryPoint
acrxGetApiVersion

Я сталкивался с аналогичной ситуацией при создании проекта с помощью ObjectARX Wizard, когда в списке экспорта отсутствовала функция acrxGetApiVersion. Выкрутился таким способом:
1. Запретил Incremental Linking
2. Добавил в Additional Dependencies: rxapi.lib (должна быть первой в списке)

Re: Ошибка: "cannot find a procedure that it needs"

acrxEntryPoint
acrxGetApiVersion

Есть эти функции, экспортирует.
1. Запретил Incremental Linking
2. Добавил в Additional Dependencies: rxapi.lib (должна быть первой в списке)
Не помогает
Может есть способ чтоб AcRxDynamicLinker показал что именно он хочет?

Re: Ошибка: "cannot find a procedure that it needs"

Проверь еще экспортируется ли _SetacrxPtp. Вообще-то все очень странно...  Для загрузки dbx-файла этого должно быть достаточно. Может быть он сам импортирует функции из какого-то DLL-файла (или другого DBX или ARX файла), который AutoCAD не в состоянии найти. Но тогда сообщение об ошибке обычно другое. Надеюсь, что используется VS .NET 2002? С другими версиями VS под AutoCAD 2005 не экспериментировал...

Re: Ошибка: "cannot find a procedure that it needs"

_SetacrxPtp не экспортирует. Но эта функция не экспортируется и в загружаемом модуле.
Есть в VC хорошая утилита Depends.Exe. Она показывает, что невпорядке с acdb16.dll и ее 2 функциями:

Acad::ErrorStatus getGripPoints(AcDbGripDataPtrArray& grips, ...)const;
void gripStatus(const AcDb::GripStat status);

для AcDbPolyline
Правда заработать dbx мне она еще не помогла.

Re: Ошибка: "cannot find a procedure that it needs"

Depends.Exe показывает что из dbx эта функция вызывается. Но в dbx точно нет такого вызова. Используется только

Acad::ErrorStatus getGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds)const

Re: Ошибка: "cannot find a procedure that it needs"

> Snoop
А ты не ObjectARX SDK 2006 для AutoCAD 2005 используешь? Или у тебя acdb16.dll от AutoCAD 2004?

Re: Ошибка: "cannot find a procedure that it needs"

Да, использую ObjectARX SDK 2006 для AutoCAD 2005. AutoCAD 2004 у меня нет.

Re: Ошибка: "cannot find a procedure that it needs"

> Snoop
Похоже, что проблемма именно в этом... В ObjectARX 2006 по сравнению с 2005 появились новые классы и методы в старых классах. У тебя линкуется acdb16.lib, которая не соответствует acdb16.dll
Кроме того если ты используешь ObjectARX Wizard 2006, то он может тебе в твой custom entity class добавить методы, которых нет в acdb16.dll от AutoCAD 2005.
Резюме: Попробуй собрать этот проект с ObjectARX 2005.

Re: Ошибка: "cannot find a procedure that it needs"

Помогло.

Re: Ошибка: "cannot find a procedure that it needs"

> Snoop
Уфф! Вот и здорово... Теперь будет наука, что нужно соблюдать требования Autodesk по соответствию версий AutoCAD и ObjectARX. В них предостаточно своих багов, так зачем же ходить по лезвию бритвы и усложнять поиск ошибок? smile
P.S. Не обижайтесь на мои поучения. Не хочется чтобы кто-то еще наступал на грабли, по которым я уже потоптался. smile

Re: Ошибка: "cannot find a procedure that it needs"

Александр, как всегда, прав. Точно такая же проблема возникла у меня с ObjectARX2000 и ObjectARX2002. Намаялся... Пока не дошло, что
происходит. Точно такое же сообщение появляется если в *.dbx приложении есть ссылки на другие объекты, и, если, они не загружены к этому моменту, то ожидай привета. Плохо, что в ObjectARX НЕТ СРЕДСТВ для отслеживания подобных процессов, даже рекомендаций или пояснений при каких ситуациях AutoCAD выдает
такое сообщение. Это очень чувствительное место..

Re: Ошибка: "cannot find a procedure that it needs"

> BS
Фактически arx-файлы - это dll-файлы, которые загружаются в конечном итоге при помощи LoadLibrary (или LoadLibraryEx). Ели в путях доступа нет файлов, описанных в секции IMPORTS или в них нет точек входа, которые необходимы ARX-файлу - он не загрузится. LoadLibrary сообщает лишь причину, по которой она не смогла загрузить ARX-файл, т.е. проанализировав ее код возврата невозможно установить какая из функций или dll-файл целиком не был найден. Для поиска неразрешенных ссылок можно воспользоваться DEPENDS.EXE (что проще) или DUMPBIN.EXE (что сложнее). Тут скорее проблема Microsoft с ее Windows и иделогией работы с dll-файлами, чем проблема Autodesk. Писать собственный загрузчик dll-файлов для Autodesk - это уж слишком... Хотя конечно Autodesk мог бы подробнее описать подводные камни, которые могут попасться на дороге у ObjectARX-программистов...

Re: Ошибка: "cannot find a procedure that it needs"

Конечно, в таких ситуациях мы используем отладочные
и вспомогательные средства Windows (а что делать).
Но сообщения-то выдает AutoCAD! В VC++ Microsoft
каждое сообщение об ошибке имеет свое толкование.
Я уверен, что каждый из нас иногда еще раз просматривает
описание какой-то ошибки, в сложной ситуации. Autodesk,
придерживаясь политики открытой архитектуры, создав целый
веер средств разработки, должна была позаботится и об
вспомогательных средствах для программистов-проффесионалах.
ObjectARX прекрасный инструмент для разработок,
но, если посмотреть какие вопросы обсуждаются
здесь на форуме, на форуме Autodesk, на ADN,
то становится немножко грустно...

Re: Ошибка: "cannot find a procedure that it needs"

> BS
...Но сообщения-то выдает AutoCAD!...
Да. Основываясь на коде ошибки LoadLibrary. Но для того, чтобы он уточнил, какую именно функцию он не может найти нужно что бы он фактически сделал тоже самое, что делает DEPENDS.EXE
Наверное это они бы были в состоянии реализовать, если бы не пекли, как блинчики, каждый год новую версию AutoCAD к очередному 8-му Марта. smile

Re: Ошибка: "cannot find a procedure that it needs"

Наверное это они бы были в состоянии реализовать, если бы не пекли, как блинчики, каждый год новую версию AutoCAD к очередному 8-му Марта. smile

Вот именно! Это и является краеугольным камнем
их доходов и наших проблем!