** 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
|
Вот и эта проблемка
|
|
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 использует именно их |
|