Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.29;
Скачать: CL | DM;

Вниз

DLL with MDI...   Найти похожие ветки 

 
Ragazor   (2006-09-15 11:16) [0]

Есть DLL с MDI формой.

Читал что для работы с мди
нужно передавать Апликейшн

этот метод не работает: (1)
type
 TdllProc = procedure(ParApplication: TApplication);
var
 DLLInstance : THandle;
 DLLProcedure : TdllProc;
begin
 DLLInstance := LoadLibrary("cmsnote.dll");
 if DLLInstance = 0 then begin
   MessageDlg("Невозможно загрузить DLL", mtError, [mbOK], 0);
   Exit;
 end;
 @DLLProcedure := GetProcAddress(DLLInstance, "DicWork");
 if @DLLProcedure <> nil then
   DLLProcedure(Application)
 else
   MessageDlg("Не найдена процедура: DicWork", mtError, [mbOK], 0);

а с использованием в библиотеке этого, работает: (2)
procedure DLLUnloadProc(Reason: Integer); register;
begin
 if Reason = DLL_PROCESS_DETACH then begin
   Application := _DLLApplication;
 end;
end;

begin
 _DLLApplication := Application;
 if @DllProc = nil then DLLProc := @DLLUnloadProc;
end.

В dll проц начинается так

procedure DWork(ParApplication: TApplication); export; stdcall;
begin
 CoInitialize(nil);
 Application := ParApplication;
 _ParentApplication := ParApplication;
 dmMain := TdmMain.Create(Application);
 WorkForm := TFormDictionaries.Create(Application);

(WorkForm = MDIchildForm)
в 1 случае WorkForm := TFormDictionaries.Create(Application)
вызывает no active MDI child form....

во втором все работает, но там проблемы с выгрузкой DLL.

со статичесткой загрузкой такие же проблемы как и в первом варианте вызова

Подскажите как нужно разрулить эту проблему?


 
Сергей М. ©   (2006-09-15 12:05) [1]


> TdmMain


Это MDIParent-форма ?


 
Ragazor   (2006-09-15 12:36) [2]

это дата модуль


 
Сергей М. ©   (2006-09-15 12:54) [3]

А где и когда у тебя создается MDIParent-форма ?


 
Ragazor   (2006-09-15 13:15) [4]

"procedure DWork(ParApplication: TApplication); export; stdcall;
begin
CoInitialize(nil);
Application := ParApplication;
_ParentApplication := ParApplication;
dmMain := TdmMain.Create(Application);
WorkForm := TFormDictionaries.Create(Application);

(WorkForm = MDIchildForm)
в 1 случае WorkForm := TFormDictionaries.Create(Application)
вызывает no active MDI child form....
"


 
Ragazor   (2006-09-15 13:16) [5]

а парент форма уже создана обычным методом :)


 
Сергей М. ©   (2006-09-15 13:32) [6]


> вызывает no active MDI child form


врешь ведь)

скорее всего отсутствует (соответственно не активна) именно MDIParent-форма)

Приведи состояние опций Build With Run-Time Packages обоих проектов ...


 
Ragazor   (2006-09-15 13:38) [7]

не вру...
парент фора есть, оттудова вызваю на Клике Меню вызова DLL с формой чайлд

опции отключены.


 
Сергей М. ©   (2006-09-15 13:39) [8]


> опции отключены.


Включи.


 
Ragazor   (2006-09-15 13:45) [9]

Но это же не выход,
таскать пекеджи по клиентским машинам...


 
Сергей М. ©   (2006-09-15 13:52) [10]

Равно как и дурно пахнущая идея - хранить формы в DLL.

Для этого есть ресурсы хост-приложения.


 
Ragazor   (2006-09-15 14:00) [11]

ну а ошибка может же быть где-то?


> Равно как и дурно пахнущая идея - хранить формы в DLL.
>
> Для этого есть ресурсы хост-приложения.


наверное не буду пытаться объяснить это начальнику...


 
Сергей М. ©   (2006-09-15 14:34) [12]


> ну а ошибка может же быть где-то?


Ошибка растет из отсебячины, которую ты несешь)

Цитирую Forms.pas:

procedure TCustomForm.CreateWindowHandle(const Params: TCreateParams);
...
 if (FormStyle = fsMDIChild) and not (csDesigning in ComponentState) then
 begin
   if (Application.MainForm = nil) or
     (Application.MainForm.ClientHandle = 0) then
     raise EInvalidOperation.Create(SNoMDIForm);

Цитирую consts.pas:

SNoMDIForm = "Cannot create form. No MDI forms are currently active";

Именно это сообщение у тебя фигурировало, а не "no active MDI child form"

Отсебячина же, согласись ?)

Отсюда и вывод - объект Application.MainForm либо nil либо не является MDIParent-формой.


 
Ragazor   (2006-09-15 14:47) [13]

procedure DWork(ParApplication: TApplication); export; stdcall;
begin
Application := ParApplication;
WorkForm := TFormDictionaries.Create(Application);

а здесь значит я его не передаю да...ясно...

и я про 2 метода не зря писал... код который выше я не меняю...
но работает только во 2 случае... а в первом пишет
"Cannot create form. No MDI forms are currently active"

и наперед, поверь, вызваю я функцию из ДЛЛ как надо, Application туда передаю...DWork(Application); где главная форма ну никак nil не равна...на ней же стоит меню по которому я кликаю...


 
Ragazor   (2006-09-15 14:50) [14]


> SNoMDIForm = "Cannot create form. No MDI forms are currently
> active";
>
> Именно это сообщение у тебя фигурировало, а не "no active
> MDI child form"
>
> Отсебячина же, согласись ?)


согласен, дезинформировал текстом ошибки.


 
Сергей М. ©   (2006-09-15 14:51) [15]


> главная форма ну никак nil не равна


И какой у нее FormStyle ?


 
Сергей М. ©   (2006-09-15 15:17) [16]


> буду пытаться объяснить это начальнику


Если начальник категоричен, то есть отличный компромисс - bpl.


 
Ragazor   (2006-09-15 15:21) [17]


> Если начальник категоричен, то есть отличный компромисс
> - bpl.

обсуждалось...


> И какой у нее FormStyle ?

шутишь да?

object FormMain: TFormMain
 Left = 220
 Top = 156
 Caption = "FormMain"
 ClientHeight = 623
 ClientWidth = 842
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = "Tahoma"
 Font.Style = []
 FormStyle = fsMDIForm
 Menu = mm
 OldCreateOrder = False
 Position = poScreenCenter
 PixelsPerInch = 96
 TextHeight = 13


 
Сергей М. ©   (2006-09-15 15:45) [18]

Ставишь брейкпойнт сюда:

Application := ParApplication

Ловишь и проверяешь знач-е св-ва ParApplication.FormStyle


 
Ragazor   (2006-09-15 15:51) [19]


> Ставишь брейкпойнт сюда:
>
> Application := ParApplication
>
> Ловишь и проверяешь знач-е св-ва ParApplication.FormStyle


fsMDIForm
это во втором случае,
а в первом объект ParApplication inaccesible value
но тут же ParApplication.mainform равен чему то там но не nil.
да и делфя у меня не 6, а 10.     2006 которая...


 
Ketmar ©   (2006-09-15 15:56) [20]

> [19] Ragazor   (15.09.06 15:51)
> а в первом объект ParApplication inaccesible value
советую помедитировать на тему "зачем нужен флажок в настройках компилятора, который отключает оптимизацию".


 
Loginov Dmitry ©   (2006-09-15 15:57) [21]

Откомпилируй все с пакетами. Этим ты сможешь сильно облегчить жизнь себе, и всем, кто пытается тебе помочь. А без пакетов наврядли у тебя что получится, ибо VCL вовсе не простая штука.


 
Ragazor   (2006-09-15 16:03) [22]

да уже по одной Статейке с инета пробовали это делать.
работает... но от это не легче.
хоцца разобраться в чем дело и сделать как надо...


 
Сергей М. ©   (2006-09-15 16:06) [23]


> Ragazor   (15.09.06 15:51) [19]


> а в первом объект ParApplication inaccesible value


В сад.


 
Ketmar ©   (2006-09-15 16:07) [24]

> [22] Ragazor   (15.09.06 16:03)
уже сказали несколько раз "как надо". с пакетами надо.



Страницы: 1 вся ветка

Текущий архив: 2006.10.29;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.045 c
1-1158744914
Старик
2006-09-20 13:35
2006.10.29
Почтовый клиент по умолчанию


2-1160519262
ice321
2006-10-11 02:27
2006.10.29
Какая функция в BDE возврашает путь к базе?


2-1160465938
shake
2006-10-10 11:38
2006.10.29
Shellexecute и динамические параметры


15-1160372968
litt
2006-10-09 09:49
2006.10.29
Плагин....


2-1160709419
Steep
2006-10-13 07:16
2006.10.29
Units Again