Форум: "Основная";
Текущий архив: 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