powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / MDI и пакеты
5 сообщений из 5, страница 1 из 1
MDI и пакеты
    #32398398
Клювик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочу, чтобы все приложение состояло из файла ехе и файлов bpl. При этом хочу, чтобы основная прога содержала родительскую форму MDI, а bpl-ки - дочерние. Все хорошо получается, но только при использовании флажка Use dynamic RTL. А мне надо, чтобы все библиотеки включались в основной файл. Вроде получилось, только при закрытии основной программы вылетает ошибка (при трассировке не происходит выгрузки программы из памяти).
Что делать? Как правильно сделать?
Спасибо
...
Рейтинг: 0 / 0
MDI и пакеты
    #32401574
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну мы тоже не телепаты :)
код бы показал ...
____
...
Рейтинг: 0 / 0
MDI и пакеты
    #32401579
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тобищь ты

удаляещь все обьекты дочерних окон итд ??
____
...
Рейтинг: 0 / 0
MDI и пакеты
    #32401616
Клювик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще-то удаляю, но поскольку главная родительская форма не в курсе про своих детей (MDIChildCount = 0, даже если дети есть), то она ничего не удаляет.
Потом я выгружаю пакидж и вот тут-то и происходит странное. Код в основной форме такой:
typedef void __declspec(dllimport)ShowAccType(int,TApplication *);
ShowAccType * ShowAcc;
//
char* path = "Pcks\\AccountsPack.bpl"
if (!Package)
Package = LoadPackage(path);
if (Package)
{
ShowAcc = (ShowAccType * )GetProcAddress((HINSTANCE)Package,
"_ShowAccount");
if (ShowAcc)
ShowAcc(firm_id, Application);
else
{
ShowMsgBox(msg_Error, MB_OK, ecode22[Lang]);
UnloadPackage(Package);
}

На закрытие формы основной так:
//
while(this->MDIChildCount)
this->MDIChildren[0]->Free();
if (Package)
UnloadPackage(Package);
В самом пакете:

void ShowAccount(int firm_id, TApplication * a)
{
if (!App)
{
App = Application;
Application = a;
}
frm_Accounts = new Tfrm_Accounts(Application);//Application);
frm_Accounts->Show();
}

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{

if ( (reason == DLL_PROCESS_DETACH) && (App) )
Application = App;
return 1;
}

И вот тут, когда процесс детачится, программа начинает вести себя странно. Если в IDE, там просто исчезает значок и нет выгрузки из памяти, а если просто запускать программу, то выдается ошибка Access violation.
При этом, если установить флажки Use RTL, все работает нормально. Но я-то хочу без них!
...
Рейтинг: 0 / 0
MDI и пакеты
    #32401825
rst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
App = Application; 
Application = a; 
frm_Accounts = new Tfrm_Accounts(Application);//

Зачем нужно присваивание Application??
Мне кажется это ненормально.
Пускай owner формы будет своя application
а parent - основное окно.
А то получается уже после DLL_PROCESS_DETACH
ссылка на объект остается.. - и он будет уничтожен только при завершении основной проги.
отсюда совершенно естественно может возникнуть и shared violation.

попробуй например так:
if ( (reason == DLL_PROCESS_DETACH )&& frm_Accounts)
delete frm_Accounts
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / MDI и пакеты
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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