Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.01.2009, 22:23
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
Вопрос Странное поведение DLL

Добрый вечер, есть проблемка: имеется базовое приложение, тестовое приложение, и DLL-библиотека из которой вызывается форма работающая с несколькими Эдитами и реестром.
Так вот, когда я компилю DLLку и подцепляю ее к тестовому приложению - все работает нормально без всяких побочных эффектов.
Но стоит мне абсолютно аналогичным образом подцепить эту же DLLку к базовому приложению то при вызове этой форму (таким же образом как и в тестовом приложении) выводится пустая форма ... мало того ... при закрытии всего базового приложения выкидавает еще и кучу ошибок ...
Подскажите, плиз ... где и что я мог пропустить ???

P.S. И в базовом и в тестовом приложении Uses одинаковы, названия и метод вызова процедур создания формы из DLL тоже одинаковый.
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
  #2  
Старый 29.01.2009, 22:39
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Это тебе скорее всего просто везло в тестовом приложении.
Дело в том, что при работе с ДЛЛ память надо выделять и освобождать в одном и том же модуле. И родителя при создании этой форме не надо ставить.

Т.е. что делаем:
1. Функция, возвращающая форму. в какой-нить переменной уровня модуля записывается указатель на класс вызовом типа: MyForm := TMyForm.Create(Nil);
2. Функция освобождения формы (тоже экспортируется из ДЛЛ) уничтожает созданный объект: FreeAndNil(MyForm).

Тогда должно заработать нормально.
Ответить с цитированием
  #3  
Старый 29.01.2009, 22:49
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

1. Форма показалась и в базовом приложении ... пасибо Imikle
2. Ошибка при завершении базового приложения так и осталась ((
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
  #4  
Старый 29.01.2009, 23:25
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Надо смотреть глубже.
Напиши подробнее ошибку.
Скорее всего она связана с попыткой удалить уже удаленный объект. Точно у формы нету ни Parent'а, ни Owner'а?
Ответить с цитированием
  #5  
Старый 29.01.2009, 23:31
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию Вот исходник DLL

Обьявление процедур в приложении:
Код:
var
procedure CreateSettForm; stdcall; External 'SettDLL.dll';
procedure CloseSettForm; stdcall; External 'SettDLL.dll';

Использование процедур:
Код:
CreateSettForm;
CloseSettForm;
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз

Последний раз редактировалось Yurk@, 16.08.2009 в 16:39.
Ответить с цитированием
  #6  
Старый 30.01.2009, 00:52
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Как форма создается в ДЛЛ?
Ответить с цитированием
  #7  
Старый 30.01.2009, 08:25
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

Код:
settForm := TsettForm.Create(nil);
settForm.ShowModal;
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
  #8  
Старый 30.01.2009, 13:31
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А если не используешь эти функции все нормально? Попробуй варианты:
1. Вообще без ДЛЛ (закомментируй все).
2. С ДЛЛ, но не вызывая ничего.

И вообще, не вижу смысла в использовании ДЛЛ при статической линковке - это практически тоже самое, что и форма в самом исполняемом модуле, но при этом есть потенциалные проблемы. Если уж делать линковку - то динамическую (через LoadLibrary). Тогда можно динамически менять ДЛЛ (например, через настройку имени библиотеки).
Ответить с цитированием
  #9  
Старый 30.01.2009, 14:05
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

Доброго дня...
1. Линковка будет динамическая (это она пока статическая).
2. С проблемкой разобрался. Оказалось, что это из-за присутствия в базовом приложении компонента XPManifest. Убираю компонент и все работает отлично.
Но надо , чтобы компонент остался и при этом все работало без ошибок. Подскажите, пожалуйста, как это можно сделать???
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
  #10  
Старый 30.01.2009, 18:50
Аватар для :S.p.a.m.
:S.p.a.m. :S.p.a.m. вне форума
Активный
 
Регистрация: 04.05.2008
Сообщения: 260
Репутация: 15
По умолчанию

У меня такая же бяка была с XPManifest. Видел бы раньше темку ответил бы сразу. Мучился, мучился так ничего и не намучал, незнаю почему из за этого овозникает ошибка. Сам хочу узнать
Ответить с цитированием
  #11  
Старый 30.01.2009, 19:13
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А какая дельфя?
У мня на 7-ке все ок. Правда я не кладу манифест на форму из ДЛЛ. Она стиль автоматом подцепляет из самого приложения.
Ответить с цитированием
  #12  
Старый 30.01.2009, 20:21
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

Делфя 7.
Я манифест кладу на главной программе, которая вызывает форму из DLL.
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
  #13  
Старый 30.01.2009, 23:29
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Странно. Ну выкладывай проект целиком (в архиве). Будем смотреть.
Ответить с цитированием
  #14  
Старый 31.01.2009, 00:25
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
Восклицание Исходники проэкта

Я обрезал проэкт до возможного (рабочего) минимума. Сейчас он работает нормально, но стоит вставить туда ХР Манифест, как появится ошибка. Исходник проэкта состоит из 2х частей. Исходник ДЛЛ в отдельном архиве.
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз

Последний раз редактировалось Yurk@, 16.08.2009 в 16:39.
Ответить с цитированием
  #15  
Старый 31.01.2009, 15:37
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

У тебя были ошибки при подключении длл (в длл проекте функция выглядела как "CreateDLLForm(App: Pointer);" а в программе "CreateDLLForm; stdcall;").
Я немного переделал проекты. Вроде все работает, но я изменил вид длл'ной формы на диалог и подключается она теперь динамически.
Вложения
Тип файла: rar dll.rar (9.5 Кбайт, 6 просмотров)
Тип файла: rar tm.part1.rar (87.9 Кбайт, 4 просмотров)
Тип файла: rar tm.part2.rar (52.9 Кбайт, 4 просмотров)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:28.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter