powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как удалить все формы из DLL?
11 сообщений из 11, страница 1 из 1
Как удалить все формы из DLL?
    #32404895
Клювик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне нужно удалить все формы из DLL. Если просто делаю:
for (int i = 0; i < Application->ComponentCount; i++)
{
if (dynamic_cast<TForm *>(Application->Components ) != NULL)
delete Application->Components;
}

Удаляется только за 1 раз 1 форма.
Значит, что-то не так.
Такое ощущение, что для каждой формы свой Application.
Библиотеки загружаются не динамично, а статично. Поэтому никакойзагрузки/выгрузки ручной нет.
Спасибо.
...
Рейтинг: 0 / 0
Как удалить все формы из DLL?
    #32405114
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На билдере не пишу, но сразу видно

iCount =Application->ComponentCount
for (int i = 0; i < iCount; i++)
...

Ибо, если, к примеру, 2 формы в модуле, то после первого удаления Application->ComponentCount будет 1.
и Application->ComponentCount<1 даст false;

второе, что кидается в глаза: переменная цикла никак не используется в цикле(по идее, идёт перечисление компонент, тогда проверка каждой компонетны должна быть по индексу (правда, индекс должен быть обратный) но это тут нет). Ну да это фигня, такое бывает.

А вот что такое Application->Components?
...
Рейтинг: 0 / 0
Как удалить все формы из DLL?
    #32405166
Фотография Cauchy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторудалить все формы из DLL
Application->Components
Что-то я не понял как в DLL появился обьект Application?
...
Рейтинг: 0 / 0
Как удалить все формы из DLL?
    #32406611
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сей достойный объект можно передать... и даже нужно это делать...
правда автор об этом не обмолвился но Я ОЧЕНЬ НАДЕЮСЬ ЧТО ОН ЭТО СДЕЛАЛ...
И абсолютно верно подметил уважаемый CEMb ... Не верный цикл...
...
Рейтинг: 0 / 0
Как удалить все формы из DLL?
    #32406613
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да и последнее.... довольно кривой метод удаления... я бы всеж воспользовался более стандартно... вызовом деструктора...
...
Рейтинг: 0 / 0
Как удалить все формы из DLL?
    #32406615
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и самое последнее... у вас скорее всего возникнут проблемы с памятью... особенно если создана форма в приложении а убиваете в dll или наоборот...
...
Рейтинг: 0 / 0
Как удалить все формы из DLL?
    #32406637
Фотография Cauchy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Клювик

Действительно написано все очень криво.

Во первых, как было уже сказано цикл должен быть обратный (i--).

Во вторых, для сравнения с NULL вовсе не обязательно делать dynamic_cast поскольку это всего лишь указатель и сравнивать с NULL можно и без преобразования. Кстати после delete нужно присваивать ему NULL. Потому что если этого не сделать, то повторная проверка "!= NULL" с таким указателем пройдет положительно.

В третьих, не понятно что ты хочешь сделать.
Если ты хочешь удалить те формы, которые создавались в DLL, то в Application->Components они не содержаться(если их самому туда не "запихнуть").
Если хочешь из DLL удалить формы приложения, то это как минимум странный подход, и, как сказал StarWind, возникнут проблемы с памятью.

to StarWind
StarWindсей достойный объект можно передать... и даже нужно это делать...
Что-то я не понял зачем он там нужен?
Объясни пожалуйста. Я всегда прекрасно обходился без него.
...
Рейтинг: 0 / 0
Как удалить все формы из DLL?
    #32407907
Клювик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CauchyЕсли ты хочешь удалить те формы, которые создавались в DLL, то в Application->Components они не содержаться(если их самому туда не "запихнуть").

Хорошо, а где они содержатся?
Код получился кривым в частности потому, что скрипт, обрабатывающий сообщение, i в квадратных скобках принял за тэг, после которого нужно писать все италиком. На самом деле там конечно есть все это.
У меня все получилось следующим образом:
TApplication * App = NULL;


//---------------------------------------------------------------------------

#pragma package(smart_init)

void ShowFrm(char * conn, TApplication * a, int user)
{
if (!App)
{
App = Application;
Application = a;
}
// frm_Det = new Tfrm_Det(Application);
if (!dm_Acc)
dm_Acc = new Tdm_Acc(Application);


Acc_frm = new TAcc_frm(Application);
Acc_frm->Show();

}
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{

if((reason == DLL_PROCESS_DETACH) && (App))
Application = App;
return 1;
}
//---------------------------------------------------------------------------
void CloseAll()
{
TAcc_frm * tmp;
int n = Application->ComponentCount;
for (int y = 0; y < n; y++)
{
string s = Application->Components[y]->Name.c_str();
if (tmp = dynamic_cast<TAcc_frm *>(Application->Components[y]) )
{delete tmp; // tmp->Close();
y--;n--;}
}
if (dm_Acc)
{
if (dm_Acc->conn_Acc->Connected)
dm_Acc->conn_Acc->Close();
}
}
Как верно заметил предыдущий оратор, утечка памяти есть. Откуда тогда их удалять???
Пришлось заменить i на y, а то бред получался.
...
Рейтинг: 0 / 0
Как удалить все формы из DLL?
    #32408081
Фотография Cauchy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КлювикКод получился кривым в частности потому, что скрипт, обрабатывающий сообщение, i в квадратных скобках принял за тэг, после которого нужно писать все италиком.
Вообще-то кроме кнопочки QUOTE на странице для нового сообщения есть еще и кнопка SRC как раз именно для кода. Тогда получится все как надо.

Клювикint n = Application->ComponentCount;
for (int y = 0; y < n; y++)
{
........
y--;n--;}
Было уже два раза сказано, что цикл ДОЛЖЕН быть обратный:
Код: plaintext
1.
2.
3.
4.
5.
int n = Application->ComponentCount; 
for (int i = n- 1 ; i >=  0 ; i --) 
 
{
........
}

Тогда извраты с "y--;n--;" будут не нужны.
КлювикХорошо, а где они содержатся?
Можно создать свой массив указателей и удалить их в цикле, можно их просто по очереди перечислить и удалить.
А вот насчет Application в DLL я надеюсь StarWind нам разъяснит.
...
Рейтинг: 0 / 0
Как удалить все формы из DLL?
    #32408802
Клювик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теперь буду знать, как коды представлять, сэнькс.
Насчет обратного цикла, да, можно и так, но по сути, без разницы, как именно делать. Потому что загвоздка не в этом, а в том, как удалить формы.
Если я удаляю их так, как написано в моем коде, то Application содержит уйму форм из главного екзешника, но здесь они все NULL, а также формы DLL, которые и благополучно удаляются. Однако очистки памяти по-настоящему нет.
Кстати, посоветуйте, как лучше (с помощью чего) следить за расходованием памяти?
...
Рейтинг: 0 / 0
Как удалить все формы из DLL?
    #32409009
Фотография Cauchy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть одна полезная програмка MemProof
Работает с Дельфи и Билдером.
Часто (но не всегда :( ) показывает то место в коде, где была выделена память.

Я в DLL формы создавал и удалял так:
Код: plaintext
1.
2.
3.
4.
5.
6.
if (!Form1) Form1 = new TForm1(Form1);
.........................
if (Form1)
{
  delete Form1;
  Form1 = NULL;
}

А у тебя создается
Код: plaintext
Acc_frm = new TAcc_frm(Application);

Т. е. владельцем формы является Application и удалять из DLL проблематично.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как удалить все формы из DLL?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]