![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DLL with MDI... [D6, WinXP]
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]а парент форма уже создана обычным методом :)