powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / проблема работы с DLL в MDI приложении
21 сообщений из 21, страница 1 из 1
проблема работы с DLL в MDI приложении
    #32414433
Alex7777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос такой:
Есть стандартное MDI приложение.
В нем есть несколько(три) классов дочерних окон. Для различных нужд.
Каждое окно находится в своей DLL. К основному проекту они подключены статически. Всё компилируется отлично и даже собирается .exe файл.
НО. При попытке создать в основном приложении дочернее окно
вылетает ошибка:
Process такой-то raised exception class EInvalidOperation with message:
' Cannot create form. No MDI forms are active'.
Что это за хрень и как бы это исправить?
...
Рейтинг: 0 / 0
проблема работы с DLL в MDI приложении
    #32414791
Gasanov2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
/*В нем есть несколько(три) классов дочерних окон. Для различных нужд.
Каждое окно находится в своей DLL. */

Все таки, где находятся классы окон в приложении или в DLL?
...
Рейтинг: 0 / 0
проблема работы с DLL в MDI приложении
    #32415148
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На чем творищь Builder C++ or VC++ ???

а так же хочется посмотреть как это ты делаешь ...
____
...
Рейтинг: 0 / 0
проблема работы с DLL в MDI приложении
    #32415186
Alex7777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Общий ответ.
Творю на C++ Bulder'e 6.0
Всё, что связано с дочерними окнами, в том числе и описание их классов, находится в соответствующих DLL.
В приложении соответственно создаются объекты этих классов.
...
Рейтинг: 0 / 0
проблема работы с DLL в MDI приложении
    #32415227
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не ну ты же как то ее вызываешь ?

попробуй все заверни в
try
{
show mdi from dll
}
exception(Exception &e)
{
show error'
}

____
...
Рейтинг: 0 / 0
проблема работы с DLL в MDI приложении
    #32415354
Alex7777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот как я это делаю:

Фрагмент кода основного приложения.
Класс TMyForm описан в соответствующей DLL. Форма является MDIChild'ом.
Класс MainForm описан в основном приложении. Форма является MDIForm'ой.

TMyForm *N_MyForm;

try
{
N_MyForm = new TMyForm(MainForm);
}
catch (Exception &e)
{
Application->ShowException(&e);
}

ShowException выдаёт 'Cannot create form. No MDI forms are active'
...
Рейтинг: 0 / 0
проблема работы с DLL в MDI приложении
    #32415384
Alex7777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А самое интересное то, что если в свойствах проектов основного приложения и соответствующих DLL на вкладке 'Packages' поставить галку в 'Build with runtime packages' все начичнает работать.
Но тогда на машине без установленного билдера такое приложение не запускается.
А хотелось бы.
...
Рейтинг: 0 / 0
проблема работы с DLL в MDI приложении
    #32415567
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело в том что это скорее всего связанно с тем что
эта дочерняя форма ничего не знает о родителских и наоборот .
и что бы они об этом знал нужно компилить модуль длл вместе с динамической библиотекой RTL и пакетом runtime ...

вот гдето это читал вот только не помню в какой книжке и кажется она у меня гдето сдесь на работе лежит , в куче других книг с Кингом итд
...
Рейтинг: 0 / 0
проблема работы с DLL в MDI приложении
    #32415678
Alex7777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это понятно.

А вот что сделать, чтобы во-первых не использовать эти rtl и bpl, а во-вторых чтобы форма понимала кто для неё MDIForm.
...
Рейтинг: 0 / 0
проблема работы с DLL в MDI приложении
    #32415787
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот это я не знаю ...

А смысл пихать MDIForms в длл темболее статическую ?

или так вы используете ранее сделаные формы ?
____
...
Рейтинг: 0 / 0
проблема работы с DLL в MDI приложении
    #32415812
Alex7777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MDIForm'a у меня одна и описана она в основном приложении.
А MDIChil'ы в DLL'ях, так как над проектом должны работать несколько человек и у каждого своя форма.
...
Рейтинг: 0 / 0
проблема работы с DLL в MDI приложении
    #32416029
Фотография Cauchy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем обязательно MDIChild ? Можно ведь и обычные формы использовать и создавать их в DLL.
...
Рейтинг: 0 / 0
проблема работы с DLL в MDI приложении
    #32416459
Gasanov2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Рекомендую из DLL экспортировать функцию которая создает экземпляр класса формы и возвращает указатель на него, а в exe пользоваться этим указателем. Такой механизм у меня работает без глюков. Правда на Delphi. Но я думаю в С++ Builder тоже будет работать.
...
Рейтинг: 0 / 0
проблема работы с DLL в MDI приложении
    #32416720
Alex7777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для тов. Gasanov2003

Так, так, так.
А если чуть поподробнее.

Я уже попробовал написать что-то подобное. Есть положительные сдвиги, но ошибка все равно вылетает.
Похоже что при создании дочернего окна оно почему-то не знает ни одной активной MDI формы.
...
Рейтинг: 0 / 0
проблема работы с DLL в MDI приложении
    #32416786
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если еще как алтернативный вариант попробовать все это
запихнуть в bpk (пакет) ?
____
...
Рейтинг: 0 / 0
проблема работы с DLL в MDI приложении
    #32417214
Alex7777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
для JibSkeart.

В варианте с bpl те же яйца, только в профиль.
Все работает до тех пор, пока проект собирается с runtime package.
...
Рейтинг: 0 / 0
проблема работы с DLL в MDI приложении
    #32417670
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Alex7777

Понятненько ...
____
...
Рейтинг: 0 / 0
проблема работы с DLL в MDI приложении
    #32418881
Gasanov2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если так написать:
В DLL
extern "C" void __declspec(dllexport) GetDLLChildForm(TApplication *ExeApp, TForm **Form);

TApplication *DLLApp;

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
// Если DLL выгружается
if (reason == DLL_THREAD_DETACH)
{
Application = DLLApp;
}
return 1;
}
//---------------------------------------------------------------------------

void GetDLLChildForm(TApplication *ExeApp, TForm **Form)
{
DLLApp = Application;
Application = ExeApp;
*Form = new TForm2(Application);
}

В exe
void __fastcall TForm1::ButtonShowDLLFormClick(TObject *Sender)
{
TForm *DLLForm;
GetDLLChildForm(Application,&DLLForm);
DLLForm->Show();
}
...
Рейтинг: 0 / 0
проблема работы с DLL в MDI приложении
    #32420304
Gasanov2003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex7777 почему молчишь ?
...
Рейтинг: 0 / 0
проблема работы с DLL в MDI приложении
    #32421025
Alex7777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to Gasanov2003

Это не я молчу. Это у нашего провайдера вчера на пол дня упал DNS server.
А что касается главного вопроса, то с небольшими исправлениями и дополнениями твоего кода все заработало.
Так что с меня магарыч :-))
...
Рейтинг: 0 / 0
проблема работы с DLL в MDI приложении
    #32421050
Alex7777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to Gasanov2003

Кстати вот что получилось у меня:
в DLL(*.cpp):
#include <vcl.h>
#include <windows.h>
#define BUILD_DLL
#include "ChildWinDLL.h"
#pragma hdrstop
#pragma argsused
TApplication *ThisApp = NULL;

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
if (reason == DLL_PROCESS_DETACH) {
if (ThisApp) Application = ThisApp;
}
return 1;
}

TMDIChild *ShowMDIChild(TApplication *CallingApp, TMDIChild *N_MDIChild)
{
if (!ThisApp) {
ThisApp = Application;
Application = CallingApp;
}
N_MDIChild = new TMDIChild(Application);
N_MDIChild->Show();
return N_MDIChild;
}
в DLL(*.h):
#include "DLLChildWinUnit.h"
#if defined(BUILD_DLL)
# define DLL_EXP __declspec(dllexport)
#else
# if defined(BUILD_APP)
# define DLL_EXP __declspec(dllimport)
# else
# define DLL_EXP
# endif
#endif
extern "C" DLL_EXP TMDIChild *ShowMDIChild(TApplication *CallingApp,
TMDIChild *N_MDIChild);
в основном приложении(*.cpp):
#define BUILD_APP
#pragma hdrstop
#include "E:\Projects\MDI\dll\ChildWinUnit\ChildWinDLL.h"

TMDIChild* N_MyForm;
N_MyForm = ShowMDIChild(Application,N_MyForm);

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


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