Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DLL with MDI... [D6, WinXP]


Страницы:   1 2

Ragazor ©   (2006-09-15 11:16:00) 

Есть 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.

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

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


Ketmar   (2006-09-15 16:07:00) [1]

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


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


> Ragazor   (15.09.06 15:51) [19]


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


В сад.


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

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


Loginov Dmitry   (2006-09-15 15:57:00) [4]

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


Ketmar   (2006-09-15 15:56:00) [5]

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


Ragazor   (2006-09-15 15:51:00) [6]


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


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


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

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

Application := ParApplication

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


Ragazor   (2006-09-15 15:21:00) [8]


> Если начальник категоричен, то есть отличный компромисс
> - 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:17:00) [9]


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


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


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


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


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


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


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


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


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

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 не равна...на ней же стоит меню по которому я кликаю...


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


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


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

Цитирую 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:00:00) [14]

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


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


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


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

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

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


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

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


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


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


Включи.


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

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

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


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


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


врешь ведь)

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

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


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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо