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

Вниз

Снова MDI из DLL: опять проблема...   Найти похожие ветки 

 
Goida ©   (2004-05-11 22:38) [0]

Написал DLL, приложение, Application из приложения передаю в DLL... Все как нужно, кажется... Да и работает, вот только частично.
Вот код в DLL:
function CreatePriceListWindow(MainApp: TApplication): longint; stdcall;
var
   DLLApp: TApplication;
begin
 DLLApp := Application;
 Application := MainApp;
 Result := longint(TfmPriceList.Create(Application.MainForm));
 Application := DLLApp
end;


Почему-то происходит следующее: MDIChild создается, но при выходе из программы вылетает сообщение "Access violation...". Application, кажется, восстанавливаю...
Странно еще то, что если я закоментирую строку
 Application := DLLApp,
то все закрывается нормально...
Может мне так и сделать? Закоментировать эту строку? Или здесь что-то другое? Объясните, где собака зарыта?


 
Mim1 ©   (2004-05-12 01:26) [1]


> Странно еще то, что если я закоментирую строку
>  Application := DLLApp,
> то все закрывается нормально...
> Может мне так и сделать? Закоментировать эту строку? Или
> здесь что-то другое? Объясните, где собака зарыта?


Закоментировть безусловно надо но для корректной работы сделайте следующее. Заведите глобальнуя переменную в ней сохранте application из dll. После того как форма будет закрыта, перед выгрузкой, восстановите application из dll. Тоже самое проделайте с обьектом screen.

В вашем коде неправильно следующее:
1. application из главноего модуля надо заменить на все время существования формы а не только на момент создания
2. вы забыли про обьект screen (с ним нужно проделать такие же операции)


 
Goida ©   (2004-05-12 09:34) [2]

Я это делал. :(
В общем, я обнаружил следующее: даже при том, что написано 1. 2., в главном приложении, если не закрыть MDIChild формы, то вылетает ошибка, та о которой я говорил. Если закрывать, проходясь по MDIChildren, то кажется что, все работает нормально, но это на первый взгляд. Если программу запустить не из Delphi, то программа опять ругается той же ошибкой :(
Что же делать?


 
Stas ©   (2004-05-12 09:49) [3]

DllApp- глобальная переменная.
Я обнаружил что в MDIChild форме вызванной из DLL не работает клавиша TAB. Кто знает что нужно сделать чтобы она работала ?


 
Goida ©   (2004-05-12 10:00) [4]


> Stas

Я это знаю....


 
evvcom ©   (2004-05-12 10:05) [5]

TApplication - это класс, реализация которого зависит от версии Дельфи, тем более среды разработки. Если exe и dll компилировались без run-time пакетов, то TApplication в exe и TApplication в dll - это совершенно разные классы! Т.е. код у них идентичен, но он присутствует как в exe, так и в dll. И одному богу известно в какой момент и по какой причине выполнение кода из одного модуля передается в другой модуль. Отсюда и "непонятные" ошибки.

Встречный вопрос. А зачем такая dll, которую можно будет использовать однократно с единственным экзешником? Я сомневаюсь, что Вы пишете суперпроект из нескольких приложений.

Совет. Если нужно использовать TApplication (и вообще какие-либо классы) в качестве параметра, то или отказаться от dll, или компилить exe и dll с run-time пакетами. Если же нужно писать dll, то использовать в качестве параметров только "простые" типы данных, т.е. такие которые не зависели бы ни от версии Дельфи, ни даже от среды разработки (языка и др.)


 
Goida ©   (2004-05-12 10:13) [6]


> evvcom

Да я не пишу супер проект, но хочу при написании курсовика изучить некоторые аспекты.
Цель у меня такая: есть у меня приложение для работы с БД, большинство функци приложения описывается в DLL (как то запрос пароля пользователем, вывод отчета, импорт данных и пр.) Так вот, чтобы сделать рабочее приложение, а потом его дособирать я и делаю с DLL.


 
Stas ©   (2004-05-12 10:18) [7]

Я делаю так и у меня работает без ошибок

library shablon;

uses
 Forms,
 DB,
 ADODB,
 Classes,
 Dialogs,
 SysUtils,
 ActiveX,
 ADDLIB in "ADDLIB.pas",
 u1 in "u1.pas" {Form1};

Var       SaveApp:TApplication;
         SaveScr:TScreen;

Procedure StartLib (App:integer;Scr:Integer;Con:TADOConnection)StdCall; export;
begin
 if Started then exit;
 saveApp:=Application;
 saveScr:=Screen;
 if App<>-1 then  Application:=TApplication(App);
 if scr<>-1 then Screen:=TScreen(scr);
 if con<>nil then
 Started:=true;
end;

Procedure StopLib; stdcall; export;
Begin
if not started then exit;
Form1.Free;
Application:=SaveApp;
Screen:=SaveScr;
started:=false;
End;

Procedure NzpRShow;
Begin
 if form1=nil then Form1:=Tform1.Create(Application)
 else form1.WindowState:=wsNormal;
end;


 
Goida ©   (2004-05-12 13:20) [8]


> Stas

Дело в том, что у меня то же самое...
А у тебя еще есть DLL кроме этой?


 
Stas ©   (2004-05-12 13:25) [9]

Есть. Но процедуры StartLib и StopLib одинаковые.
Я подключаю ее динамически может из-за этого у меня не выдает ошибки.


 
Stas ©   (2004-05-12 13:27) [10]

К стати она работает лишь на тех приложениях, которые были откомпилированны в одной версии  Delphi с DLL.


 
Goida ©   (2004-05-12 13:30) [11]


> Stas

Эх, ну все точно так же :( И динамически, и в одной версии...
Может через экспорт класса пойти?


 
Stas ©   (2004-05-12 14:26) [12]

Ну, незнаю...


 
Goida ©   (2004-05-12 14:53) [13]


> Stas

Как странно :) и здесь тоже самое!... =)


 
Stas ©   (2004-05-12 16:46) [14]

:-)))


 
Goida ©   (2004-05-14 11:51) [15]

Я решил проблему. Теперь у меня все работает :)



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

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

Наверх




Память: 0.51 MB
Время: 0.024 c
11-1074438248
Neznaika
2004-01-18 18:04
2004.05.30
MHLame для Delphi6


14-1084360870
bon
2004-05-12 15:21
2004.05.30
Как отменить все сообщения, посылаемые окну?


1-1084886026
Dina
2004-05-18 17:13
2004.05.30
RecNo записи


3-1084268842
Sterpa
2004-05-11 13:47
2004.05.30
Как сохранить всю БД (любую) в 1 файл


14-1084447526
Tamagoci
2004-05-13 15:25
2004.05.30
Использование Thread при обновлении состояния Action ов