Тема: Вызов managed форм в AutoCAD

Вопрос относиться к 2002-му (на 2004 и 2005 не проверял) - скорее всего то же.
Если в managed code dll-ки выполнить вызов формы (можно сделать showDialog или MessageBox.Show("Hello world")), то автокад все это корректно отображает, но его(автокада) потроха в последствии ломаются.
Например, если попытаться добавить словарь в текущую базу из диалога, то он добавляется, но при попытке pNewDict->close() летит эксепшен. Происходит всякий такого рода кал. Т.е. Автокад вроде жив - но он становится сильно больной.
При закрытии автокада студия выдает такое:
First-chance exception in acad.exe (MSCORWKS.DLL): 0xC0000005: Access Violation.
First-chance exception in acad.exe (MSCORWKS.DLL): 0xC0000005: Access Violation.
The thread 0x284 has exited with code 20 (0x14).
First-chance exception in acad.exe (KERNEL32.DLL): 0xE0434F4D: (no name).
The thread 0xAD0 has exited with code 20 (0x14).
The thread 0xC78 has exited with code 20 (0x14).
The thread 0x8B8 has exited with code 20 (0x14).
AcDb.dll Terminating!
acfirst.dll Terminating!
The thread 0x1B8 has exited with code 20 (0x14).
The program 'C:\AutoCAD\AutoCAD 2002\acad.exe' has exited with code 20 (0x14).
Такая вот фигня. Просидел весь вечер - пошел домой так и не поняв - что же акад нагибается от простого показывания формочек из managed кода. Никакой перегрузки ресурсов не требуется... для MessageBox-а уж точно...

Re: Вызов managed форм в AutoCAD

Блин, проверил в 2004 - В 2004/2005 работает все корректно... Баг ислючительно 2002-го... наверное все-таки у него с managed кодом не все срастается...

Re: Вызов managed форм в AutoCAD

Чем дальше тем интересней...
2004-й, 2005-й не дают запускать себя под дебагом, чтоб отдебажить что - надо к процессу акада приаттачиться.
Запустил приложение не из под дебага в 2002-м - все прошло как по маслу! - автокад 2002 живет и здравствует.
Т.е. проблема в том что MSVC 6.0 цепляет дебагом за акад и при исполнении managed кода с отображением диалога происходит какая-то неразбериха и акад под пристальным вниманием MSVC нагибается...
Думаю вот...Не по этой ли причине Autodesk запретил цепляться дебагу за acad.exe 2004/2005 - и надо аттачиться к процессу...?

Re: Вызов managed форм в AutoCAD

> KonstantinM
Рискну предположить, что дело в разных алгоритмах управлении памятью - 2002 акад использует механизм 6 студии, а твой код использует механизм VS.Net. Для преодоления этой проблемы я переопределяю операторы new и delete (я использую VC++7.1 вместе с 2002 акадом).

Re: Вызов managed форм в AutoCAD

Слушай - а можешь скинуть исходник тел методов операторов того что ты напереопределял с new и delete чтоб "все работало"?
Дело в том что я "уломал" arx написанные на VS 6.0 грузить mixed dll-ки написанные на VS 2002/2003, чтоб соединить существующий C++ код с С# кодом без COM в одном AppDomain-е. При этом пришлось сделать ряд ухищрений, чтоб выделенная память убивалась тем менеждером памяти (6-м или 7-м), которым она и была выделена.
Если создать объект в VS7-й dll-ке передать его в VC6-ую dll-ку и там убить, то это приводит к фатальным ошибкам... Т.е. два манагера памяти лазают друг к другу и стучат друг друга по рукам... Т.е. вместе уживаются плохо. При этом я пробовал играться с new и delete, но что-то ничего не вышло. Т.е. дело не в том КАК выделяется память, а в том КЕМ она выделяется...

Re: Вызов managed форм в AutoCAD

Да всё очень просто, сначала создаём dll (я назвал её crtproxy.dll), которая экспортирует всего две функции:
void* ProxyAlloc(size_t size) {
    return  (operator new)(size);
}
void ProxyDealloc(void *ptr) {
    delete ptr;
}
и компилируем это дело нужной студией (зависит от версии автокада, если 2002, то используем VC++6).
Ко всем разрабатывемым библиотека подключаем crtproxy.dll, а также добавляем файл с таким вот кодом:
extern void* ProxyAlloc(size_t);
extern void ProxyDealloc(void *);
void* operator new(size_t size) {
    return ProxyAlloc(size);
}
void operator delete(void *ptr) {
    ProxyDealloc(ptr);
}

Re: Вызов managed форм в AutoCAD

Ж:) Ну примерно так и сделал... Только не догадался Alloc и Dealloc запихивать в new и delete.
Ну и еще скажу, что было бы правильно переопределить new и delete и для массивчиков, чтоб корректно отрабатывали такие консструкции как
pArr = new Type[N];
delete [] pArr;

Re: Вызов managed форм в AutoCAD

> KonstantinM
Согласен. Но пока с этим проблем не было - не припомню ситуации, где Автокад мне возвращает простой масив, который я должен удалить, или где я создаю простой масив и отдаю его Автокаду.

Re: Вызов managed форм в AutoCAD

И еще crtproxy - должна быть не dll-кой а arx-ом. Чтоб тот new и delete, которые юзаются в Alloc и Delloc были arx-кими. Иначе потроха arx-а при убиении объекта в своих глубинах созданного тобой - будут ругаться что-то типа - try do delete memory which wasn't allocated on acad heap (что-то в этом роде...)

Re: Вызов managed форм в AutoCAD

Ну не знаю, подобных сообщений не видел, в какой ситуации такое наблюдается?
Вчера получили по партнёрской программе VS 2005 Beta 2, так я перекомпилировал всё тамошним комплиятором - работает нормально, никаких сбоев нет smile

Re: Вызов managed форм в AutoCAD

Кстати, на той неделе тоже получили VS 2005 Beta 2, но у себя еще не ставил. . Первая Beta 1 - заваливала комп начисто. Т.е. там была сносочка что ставить рекомендуется на машину НЕ рабочую сделав предварительно BackUp-ы.
Первая бета роняла комп - т.е. все остальные приложения переставали нормально функционировать - помогало только полная перестановка системы.
Как эта? На отдельном компе поставил или уже нормальная вторая бета - живет ли дружно с VS 2003? и VS 6.0?
Кстати после установки второго сервис пака XP перестала ставиться 6-ая студия :(
Короче чем больше всего этого на ПК установлена тем толше партизаны.

Re: Вызов managed форм в AutoCAD

У меня на машине (XP SP2) стоит VS 6.0, VS 2002, VS 2003 и VS 2005 Beta 2 smile
Вроде бы всё нормально работает, но гарантировать ничего не могу - от всех этих студий я использую только компиляторы, а IDE не использую, ибо ИМХО отстой - вместо этого использую Emacs + Boost.Build.

Re: Вызов managed форм в AutoCAD

Но то что VS 6.0 надо ставить до XP SP2 - это проверено - в противном случае не ставится.

Re: Вызов managed форм в AutoCAD

> archimag
----------------
Да всё очень просто, сначала создаём dll (я назвал её crtproxy.dll), которая экспортирует всего две функции:
void* ProxyAlloc(size_t size) {
return (operator new)(size);
}
void ProxyDealloc(void *ptr) {
delete ptr;
}
и компилируем это дело нужной студией (зависит от версии автокада, если 2002, то используем VC++6).
Ко всем разрабатывемым библиотека подключаем crtproxy.dll, а также добавляем файл с таким вот кодом:
extern void* ProxyAlloc(size_t);
extern void ProxyDealloc(void *);
void* operator new(size_t size) {
return ProxyAlloc(size);
}
void operator delete(void *ptr) {
ProxyDealloc(ptr);
}
-------------------------
С такой жопой(сорри) столкнулся...
Чтобы экспотировать метод
void ProxyDealloc(void *ptr) в crtproxy, надо вставить __declspec(dllexport) (или еще как можно?)
Короче как только делаю __declspec(dllexport) - в 1.arx и потключаю ее к 2.dll(C++.NET) - на Managed C++ - то по закрытию акада валится эксепшен, что мол какой то эвент пытаются отправить по 0x000000...
Ты используешь crtproxy.dll только в обычных плюсовых dll-ках, или в управляемых тоже?

Re: Вызов managed форм в AutoCAD

> KonstantinM
Только в обычных, управляемый код у меня вызывает неприкрытое раздражение smile
Кстати, можешь вместо этого трюка попробовать прилинковать к своему модую rxheap.lib...

Re: Вызов managed форм в AutoCAD

Вобщем могу сделать резюме, что такой "фокус" в управляемых dll-ках не проходит. Хорошо что она у меня только одна. Смог разрулить это пока только так -
1) crtproxy.dll предоставляет интерфейс IMemoryAllocator - c alloc и free
2) 2.dll - интерфейс IMemAllocatorReg и экспортирует метод extern "C" IMemAllocatorReg* GetMemAllocReg(); в 2.exp файлике экспортируется GetMemAllocReg - т.е. обходимся без  _declspec(dllexport)-а.
3) crtproxy.dll грузит 2.dll, достает через HMODULE - IMemAllocatorReg и регистрирует в 2.dll IMemoryAllocator
Такая, блин, трехходовка... :) Че еще придумать не знаю... Вообще С++.NET для того и придуман, чтоб код на С++ портировать через оболочки в .NET - но в автокаде куча сюрпризов в этом плане. То что акад по своему память выделяет - это еще пол-беды...
Ну и при такой позе приходится следить чтоб гне было глобальных переменных или статических объектов - чтоб при загрузке 2.dll - ни дай бог хотябы один объект не создался...

Re: Вызов managed форм в AutoCAD

> KonstantinM
Кстати, а зачем это вообще надо? Что такого даёт управляемый код (в контексте программирования под Автокад), что ради него приходится идти на бодобные хитрости (при этом, довольно сильно рискуя)?

Re: Вызов managed форм в AutoCAD

В Контексте программирования под автокад - это дает возможность написать на С++ свой движок с ObjectARX, а интерфейсы как оболочки (то бишь API) вытащить на .NET. А предметную область проектирования (где автокад это всего лишь вспомогательный инструмент написать на .NET) При этом код предметной области сравним или даже намного больше чем код непосредственно использующий ObjectARX. Поэтому в контексте разработки под ObjectARX это ничего не дает кроме гемора, а в контексте разработки предметного программного комплекса дает возможность юзать все прелести .NET (А писать GUI или DB на плюсах всяко геморнее чем на .NET)

Re: Вызов managed форм в AutoCAD

Вот собственно у меня и задача - написать все что надо от Автокада на С++ под ObjectARX. И завернуть все это барахло в .NET. Типа враперы написать. Типа говорят что для этого Managed C++ и спроектирован. И на самом деле данные передавать ну на порядок проще и быстрей чем через COM. Проблема только в том что память поделить не могут (приходиться писать этот arxallocator ) и в том что есть некий гемор при загрузке Managed Mixed DLL в Автокад.