C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Форма в DLL
** Aleks
Отправлено: 20.07.2004, 14:56


Не зарегистрирован







Спрашивал решение моей проблемы на других форумах но так никто ничем и не помог, надеюсь найти здесь решение. Проблема такая.
В dll имеется динамическая создаваемая форма. Когда я из dll вызываю создание этой формы в панели задач появляется новое окно. А также все диалоговые формы, вызываемые из dll, также появляются в панели задач. Причем этого не происходит когда проект создан как Full debug. Скажите как с эти бороться.
Заметил только одно когда проект компилируется как relise у моей формы почему-то пропадает owner. Заранее спасибо.
AVC
Отправлено: 20.07.2004, 15:25


Ветеран

Группа: Модератор
Сообщений: 1583



Формы в панели задач регистрируются если вы создаете окна с параметром WS_EX_APPWINDOW. Поищите по своему тексту где вы переопределяете стиль окна.
** Aleks
Отправлено: 20.07.2004, 15:58


Не зарегистрирован







Там нечего переопределять пишу просто
CODE

TForm *f=new TForm(Application)
f->ShowModal

как тогда быть с сообщениями типа ShowMessage, они тоже почему-то там выскакивают (в панели задач)
AVC
Отправлено: 20.07.2004, 17:08


Ветеран

Группа: Модератор
Сообщений: 1583



Положите свою dll и дайте описание точки входа. Интересно посмотреть. Может удастся помочь.
DarkStar
Отправлено: 21.07.2004, 19:50


Ученик-кочегар

Группа: Участник
Сообщений: 20



Вот и эта проблемка sad.gif

User Attached Image Скачать файл
Trouble.zip


AVC
Отправлено: 22.07.2004, 09:53


Ветеран

Группа: Модератор
Сообщений: 1583



Включите и в Application и в Dll
Prodject Options — Packages — Runtime packages
Build with runtime packages +
Packages (как минимум) VCL50

Следите внимательно за runtime packages. Список в dll должен быть подможеством от списка в Application.
AVC
Отправлено: 22.07.2004, 10:24


Ветеран

Группа: Модератор
Сообщений: 1583



Вариант №2

Приложение
CODE

typedef void __declspec(dllimport) GetAdr(TApplication*);

void __fastcall TForm1::Button1Click(TObject *Sender)
{
HINSTANCE Dll=LoadLibrary("MyDll.dll");
if(Dll)
{ GetAdr *CreateForm = (GetAdr *)GetProcAddress(Dll, "_CreateForm");
   if(CreateForm) CreateForm(Application);
   else ShowMessage("Функция CreateForm не обнаружена в MyDll.dll");
   FreeLibrary(Dll);
}
else ShowMessage("Не удается загрузить MyDll.dll");
}


Dll
CODE

extern "C" void __declspec(dllexport) CreateForm(TApplication*);

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

void CreateForm(TApplication* pApp)
{
// для MDI форм Application советуют сохранять и восстанавливать при DLL_PROCESS_DETACH
Application = pApp;
TForm2 *f = new TForm2(Application);
f->Position=poScreenCenter;
f->ShowModal();
delete f;
}


PS
Если dll предназначена только для проектов на Borland лучше использовать вариант 1 и перейти на Package
DarkStar
Отправлено: 22.07.2004, 12:43


Ученик-кочегар

Группа: Участник
Сообщений: 20



Пробовал по первому варианту, действительно все получилось.
А можешь объяснить в чем отличие с Pacages и без них?
AVC
Отправлено: 22.07.2004, 13:12


Ветеран

Группа: Модератор
Сообщений: 1583



Пакеты (BPL) это те же dll но "заточенные" под Borland.
Описатель Package тот же export/import в одном лице. Написать один раз PACKAGE проще чем два раза __declspec(dllexport), __declspec(dllimport).
+ он добавляет в bpl к имени функции типы параметров и тип возврата, что, хоть как то, позволяет контролировать косвенные вызовы при динамической загрузке bpl.
+ Borland использует именно их

Вернуться в Вопросы программирования в C++Builder