Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.037 c
2-1160737247
o_serg
2006-10-13 15:00
2006.10.29
DesignTime


2-1160662054
novill
2006-10-12 18:07
2006.10.29
Почему TFileStream.size показывает 0 если файл отрывается


3-1157436969
Itonix
2006-09-05 10:16
2006.10.29
удаление Fields из ibQuery


15-1159951325
Neud
2006-10-04 12:42
2006.10.29
HLP декомпилятор.


2-1160722864
проходил мимо решил заглянуть
2006-10-13 11:01
2006.10.29
скопировать файл





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский