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

Вниз

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

Наверх





Память: 0.49 MB
Время: 0.035 c
4-1082055682
Анатолий Ксюндзский
2004-04-15 23:01
2004.05.30
CreateProcess ??


4-1082030697
mich
2004-04-15 16:04
2004.05.30
WNetGetUniversalName


14-1084291595
Lena19
2004-05-11 20:06
2004.05.30
ищу инфу по написанию визуальных компонентов (РУС)


6-1081184602
Kirill
2004-04-05 21:03
2004.05.30
IdHTTP и сессия


1-1084657848
tamroF
2004-05-16 01:50
2004.05.30
____________ проблема с DLL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский