Текущий архив: 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.49 MB
Время: 0.041 c