![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Breezy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 21.8.2003 Репутация: нет Всего: 1 |
Пишу небольшой плагинчик под маленький редактор. Чтобы не заморачиваться с окошками юзаю форму NET-а.
Так вот, DLL создает некий класс, про который редактору ничего не извесно. Редактор поюзав этот класс через интерфейсы рано или поздно хочет удалить его. Так вот погугливши выяснил, что спасти меня может если все скомпилить с RunTime : Multi-threaded DLL. Но тут возникает маленткая проблемка!!! Форму в Multi-threaded DLL запустить не так то и просто... У когонибудь есть умные идеи? |
|||
|
||||
Exception |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 4525 Регистрация: 26.12.2004 Репутация: 29 Всего: 186 |
Вот это вообще не понял. Ты имеешь в виду, что нужно использовать MTA или что? И почему? И что там с формой? |
|||
|
||||
Breezy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 21.8.2003 Репутация: нет Всего: 1 |
Exception
Длл создает обект new XXXX (клас унаследован от интерфейса), передает редактору указатель..., тот поюзав обект, удаляет его: delete... в этот момент винда мне и говорит куда ты лезеш а? память была выделена длл.... |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Breezy, удалить экземпляр managed-объекта можно только с пом. managed-операции delete. А вы как его удаляете ?
-------------------- ![]() |
|||
|
||||
DarkDragon |
|
|||
![]() GradVin ![]() ![]() Профиль Группа: Участник Сообщений: 296 Регистрация: 19.8.2006 Репутация: нет Всего: 8 |
||||
|
||||
Breezy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 21.8.2003 Репутация: нет Всего: 1 |
mr.DUDA
>Breezy, удалить экземпляр managed-объекта можно только с пом. managed-операции delete. А вы как его удаляете? Скажем так, я использую не managed С++, возможно проблема именно в том, что у управляяемого С++ свой delete ![]() DarkDragon >Не понял. Откуда же в .NET появилась ф-ция делить? Или это только на C++/C++.NET распространяется? Я использую нетовскиую форму только потому что на ней можно быстро накидать окошки. На голом WinApi делать - убийство, MFC - та ещё дрянь: остаеться один .NET Так вот я использую managed С++ для окошка, и не managed - для своего проекта. Как оказалось оба они могут сосуществовать не мешая друг другу. Тоесть если бы я делал все в одном проекте, и подключал обекты статически то небыло бы у меня проблем, но это не круто, мне нужен именно плагин а то переписывать код по 100 раз это совсем не хорошо... |
|||
|
||||
mr.DUDA |
|
||||||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Тьфу, сорри, запутался сам и запутал человека
![]()
Неужто, объект созданный в .NET окружении вы удаляете обычным оператором delete в win32 dll ? Добавлено @ 20:35
Скорее всего, сказалось то что в "смешанном" C++ есть оператор delete, который можно применить к объекту или участку памяти, выделенному оператором new; но это не даёт права удалять объект, выделенный оператором gcnew (в шарпе - просто new). Все managed-объекты удалять не нужно, сборщик мусора убъёт их сам. Добавлено @ 20:36 А чтобы закрыть форму, достаточно вызвать её метод Close -------------------- ![]() |
||||||
|
|||||||
Breezy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 21.8.2003 Репутация: нет Всего: 1 |
mr.DUDA
Не смовсем так!!! Я использую Форму только для того, чтобы юзать нетовские кнопочки!!! На этом работа Manage C++ закончилась!!! DLL написана на голом WinApi, и использует обыкновенный new. просто я немогу удалить обект созданый в длл. Напиши я тоже самое в проекте который обращаеться к длл и delete отлично сработает ) Это сообщение отредактировал(а) Breezy - 9.12.2006, 20:58 |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Так зачем его удалять ?
![]() Удалять-то не надо. -------------------- ![]() |
|||
|
||||
Breezy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 21.8.2003 Репутация: нет Всего: 1 |
mr.DUDA
Это те кто под НЕТ работают могут себе позволить не убирать за собой, надеясь, что сборщик мусора прожует все, даже файлы открытые с флагом только чтение и оставленные последнему... Проблема в том, та часть проекта которая не являеться manage C++ активно юзает delete кстати только что проверил в нутри данного проекта delete отлично работает... а вот с длл проблемі ![]() |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Проблема в том, что unmanaged С++ смешивается с managed. Вот и возникает путаница. ИМХО.
Явно удалять объекты, созданные в управляемой куче -- нельзя. Но можно и нужно освобождать ресурсы (файл, GUI-ресурсы, коннекшны к БД и т.п.), для этого есть метод Dispose, реализуемый практически каждым классом "жующим ресурсы". В случае .NET, если объект был создан для класса из внешней длл, это ничего не меняет. -------------------- ![]() |
|||
|
||||
Breezy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 21.8.2003 Репутация: нет Всего: 1 |
mr.DUDA
Давай посудим: dll - unmanaged C++ exe unmanaged C++/managed C++; Как я понял чтоб убрать проблему надо всему выставить RunTime : Multi-threaded DLL; Я немогу этого сделать для EXE ![]() |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Что-то я не соображу, каким это боком изменение C++ runtime на Multi-threaded разрешит unmanaged dll-ке делать unmanaged delete над формой. ![]() -------------------- ![]() |
|||
|
||||
DarkDragon |
|
|||
![]() GradVin ![]() ![]() Профиль Группа: Участник Сообщений: 296 Регистрация: 19.8.2006 Репутация: нет Всего: 8 |
Чета нифега не понял!
Где у тебя форма в DLL, или в самой программе? Если тебе нужно удалить unmanaged обьекты, пишешь delete [обьект];, Если же тебе нужно удалить managed обьекты, если есть метод Dispose() вызываешь его, ставишь NULL, и вызываешь коллектора: Form1 frm = New Form1(); frm.ShowDialog(); frm.Dispose(); frm = NULL; GC.Collect(); // Все. Unmanaged ресурсы (используемые формой иконки, курсор, и т. д.) стерты, ссылка на класс frm, обнуляется, больше //рефереса, не имеет, коллектор его кушает! Или у тебя программа наоборот сама делит? обьясни подробно что за проблема! |
|||
|
||||
Breezy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 21.8.2003 Репутация: нет Всего: 1 |
Выпил пива, чтоб меньше
![]() так постараюсь по пунктам: 1. Пишу на С++ проект. 2. Пишу редактор для проекта(с испольованием НЕТ) 3. К редактору подключаетьс ряд плагинов(dll), плагины относяться к С++ проекту(пункт 1) 4. Редактор(обычная нетовская форма), по нажатию всяких кнопочек управляет классом из проекта под пунктом 1. 5. ДЛЛ создает некий класс, и передает в редактор, где этим класом далее управляет проект п.1 Так вот изначально проект 1 был задуман как "single tread", но чтоб подключить плагин пришлось его сделать многопоточным, иначе нелязя удалять память выделенную в другом потоке. Итак сам проект, длл я могу без особых проблем скомпилить, а нетовскую фору в Multi-threaded DLL преобразовать не получаеться ( |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |