Тема: Наследование от AcDbObject

Уважаемые коллеги!
Создал свой объект наследованный от AcDbObject.
Информация о созданных объектах сохраняется в NOD.
В отдельном приложении пытаюсь получить эти объекты
из NOD используя cast механизм:
  pMyObj = MyObj::cast(pObj);
Линкер выдает: unresolved external symbol .....MyObj::desс(void)......
В StdArx.h есть ссылка на MyObj.h, и в Setting--->Link есть ссылка на MyObj.lib
В чем может быть проблема? (AutoCAD 2000)
Спасибо большое

Re: Наследование от AcDbObject

> BS
А класс MyObj содержит метод desc()?
Содержит ли класс макросы ACRX_DXF_DEFINE_MEMBERS и   ACRX_DECLARE_MEMBERS?

class DLLIMPEXP MyObj : public AcDbObject {
public:
  ACRX_DECLARE_MEMBERS(MyObj) ;
  MyObj () ;
  virtual ~MyObj () ;
  //----- AcDbObject protocols
  //..............
} ;
ACRX_DXF_DEFINE_MEMBERS (
  MyObj, AcDbObject,
  AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
  AcDbProxyEntity::kNoOperation, MYOBJ,
  "CUSTOBJECTAPP"
  "|Product Desc:     A description for your object"
  "|Company:          Your company name"
  "|WEB Address:      Your company WEB site address"
)

Re: Наследование от AcDbObject

Cпасибо за ответ. Все перепроверил. Все
определения на месте. Но в отношении
desc(), я его не определял(да и как?), этот
метод базового класса, к тому же он не virtual,
C другой стороны, для cast(..), написано что эта функция должна быть определена
независимо в каждом классе, как это все увязывается?
Спасибо

Re: Наследование от AcDbObject

BS пишет:

Но в отношении
desc(), я его не определял(да и как?), этот
метод базового класса, к тому же он не virtual

1) Если есть макрос ACRX_DXF_DEFINE_MEMBERS, то функция MyObj::desc() определяется этим макросом автоматически.
2) Если посмотреть таблицу экспорта dbx-файла для приведенного мной примера, то можно увидеть:

public: static class AcRxClass * __cdecl MyObj::desc(void);

3) Это не метод базового класса, а статическая функция именно твоего класса.

Re: Наследование от AcDbObject

P.S.: Для понимания всего этого внимательно посмотри содержимое файла rxboiler.h из каталога ObjectARX\inc

Re: Наследование от AcDbObject

Александр, спасибо за совет. там больше информации чем в help, и все становится понятным. Выходит, что эти макросы обеспечивают объявление и реализацию этих функций. Но макросы у меня есть, или я что-то недопонял.
Спасибо

Re: Наследование от AcDbObject

Александр, спасибо за совет. там больше информации чем в help, и все становится понятным. Выходит, что эти макросы обеспечивают объявление и реализацию этих функций. Но макросы у меня есть, или я что-то недопонял?
Вообще, если создается класс, наследник AcDbObject, то технически нужно это сделать в отдельном файле, и, предварительно загрузить перед использованием, т.е. как в dbx?
Спасибо

Re: Наследование от AcDbObject

> BS
Для того чтобы убедиться экспортируется ли эта функция:

dumpbin /exports MyObj.lib
и
dumpbin /exports MyObj.dbx

Если нет, то ищи ошибку почему эти макросы не компилируются...

Re: Наследование от AcDbObject

BS пишет:

то технически нужно это сделать в отдельном файле, и, предварительно загрузить перед использованием, т.е. как в dbx

Можно и не в отдельном, можно и в .arx, хотя лучше в .dbx - во всяком случае так рекомендует Autodesk.

Re: Наследование от AcDbObject

Спасибо Александр! Вот что выяснилось.Если я пытаюсь получить этот объект из функции находящиеся в этом же проекте т.е. в том же arx,то все ок. Если из другого проекта, то проблема. И еще. Вы написали очень интересную вещь. Я до сих пор считал что custom объект наследуемый от AdDbEntity следует создавать отдельно в файле с расширением dbx, а custom объект наследуемый AcDbObject можно создавать в общем проекте arx, или в отдельном, но только с расширением arx. Попробовал в отдельном файле arx, не идет.

Re: Наследование от AcDbObject

> BS
Расширение файла никакой роли не играет. И в данном случае не важно от чего наследуется (от AcDbEntity или AcDbObject). Важно чтобы класс объекта был правильно зарегистрирован и встроен в иерархию классов. В принципе в одном arx/dbx-файле может быть несколько классов объектов/примитивов. Только нужно для каждого из них пара макросов и регистрация в InitAppMsg:

MyObj1::rxInit();
MyObj2::rxInit();
//...
MyEnt1::rxInit();
MyEnt2::rxInit();
//...
acrxBuildClassHierarchy();

Ну а в UnloadAppMsg:

deleteAcRxClass(MyObj1::desc());
deleteAcRxClass(MyObj2::desc());
//...
deleteAcRxClass(MyEnt1::desc());
deleteAcRxClass(MyEnt2::desc());
//...

Re: Наследование от AcDbObject

Проверил, все на месте. Наверное, где-то
косвенным образом напартачил, другого объяснения нет.
Александр, огромная Вам благодарность за помощь.

Re: Наследование от AcDbObject

> BS
Продолжим.
1) В библиотеке импорта (lib) есть MyObj::cast()?
2) Может быть в другом проекте подключил не этот lib?

Re: Наследование от AcDbObject

Если посмотреть на lib невооруженным глазом
то MyObj::cast() там нет, а подключен ли он, это
я сразу проверил. В stdArx.h ссылка на MyObj.h
также есть.

Re: Наследование от AcDbObject

Значит ACRX_DXF_DEFINE_MEMBERS не откмпилировался.

Re: Наследование от AcDbObject

По видимому что-то мешает.После ACRX_DXF_DEFINE_MEMBERS у меня стоит
MAKE_ACDBOPENOBJECT_FUNCTION(MyObj); Но и это не мешает. Лучше всего, наверное, переписать все
по новому. Иногда это помогает.

Re: Наследование от AcDbObject

> BS
1) Приведи полный текст этого макроса у себя в программе.
2) Убери из свойств проекта для C++: Using Precompiled Headers и для Linker: Increment linking и выполни Rebuild All - очень часто это все ставит на места.

Re: Наследование от AcDbObject

Александр, ты велик! Я проделал еще один эксперимент, скорее безсознательно. Просто
создал с помощью визарда для dbx проект и
просто скопировал все файлы с поправкой на
название класса. и все ок!. Нет слов.
Thank you very much! С наступающим Новым Годом!
Здоровья, всех благ, успехов!

Re: Наследование от AcDbObject

> BS
:) Ну и отлично. Похоже, что проблема была именно в Using Precompiled Headers. При создании нового проекта они пересоздались по новой и в результате все стало на свои места.
С Новым Годом! (с остальными праздниками исторической родины я уже не успел поздравить)! :)

Re: Наследование от AcDbObject

Спасибо. Перенес на "чистый" компъютер т.е. без VC++, и он тут же убил на месте сообщением: MyApp.arx cannot find a dll or other file that it needs. AcRxDynamicLinker failed to load ...MyApp.arx. Что-то он тянет из MFC? Первый раз такое, и ничего не могу найти. Сравнивал с другими, работаюшими аппл,то же самое.
Спасибо

Re: Наследование от AcDbObject

> BS
1) Использвался ObjectARX SDK 2000 или 2000I или 2002?
2) Таблицу импорта для этого arx-файла сюда.
Ну а дальше будешь искать dll (или dbx или arx) от которого этот arx-файл зависит и который еще не загружен в AutoCAD и не находится в путях доступа.

Re: Наследование от AcDbObject

1)Использую ObjectARX SDK 2000.
2) Предварительно загружаю зависимый arx-файл,
с этим все ок.
Не могу сообразить где находится таблица импорта

Re: Наследование от AcDbObject

> BS

dumpbin /imports MyApp.arx >> MyApp.txt

И содержимое MyApp.txt сюда.

Re: Наследование от AcDbObject

Нашел! msvcirtd.dll, msvcrtd.dll
Большое спасибо, и извени за настырность.

Re: Наследование от AcDbObject

> BS
Вывод - ты переписал на компьютер, на котором не установлен VS arx-файл скомпилированный в Debug mode, чего делать ни в коем случае нельзя. AutoCAD при инсталляции устанавливает dll-файлы годящиеся только для Release mode.