|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Странное поведение DLL
Добрый вечер, есть проблемка: имеется базовое приложение, тестовое приложение, и DLL-библиотека из которой вызывается форма работающая с несколькими Эдитами и реестром.
Так вот, когда я компилю DLLку и подцепляю ее к тестовому приложению - все работает нормально без всяких побочных эффектов. Но стоит мне абсолютно аналогичным образом подцепить эту же DLLку к базовому приложению то при вызове этой форму (таким же образом как и в тестовом приложении) выводится пустая форма ... мало того ... при закрытии всего базового приложения выкидавает еще и кучу ошибок ... Подскажите, плиз ... где и что я мог пропустить ??? P.S. И в базовом и в тестовом приложении Uses одинаковы, названия и метод вызова процедур создания формы из DLL тоже одинаковый. Поживу - увижу, Доживу - узнаю, Выживу - учту. [P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
|
#2
|
|||
|
|||
Это тебе скорее всего просто везло в тестовом приложении.
Дело в том, что при работе с ДЛЛ память надо выделять и освобождать в одном и том же модуле. И родителя при создании этой форме не надо ставить. Т.е. что делаем: 1. Функция, возвращающая форму. в какой-нить переменной уровня модуля записывается указатель на класс вызовом типа: MyForm := TMyForm.Create(Nil); 2. Функция освобождения формы (тоже экспортируется из ДЛЛ) уничтожает созданный объект: FreeAndNil(MyForm). Тогда должно заработать нормально. |
#3
|
||||
|
||||
1. Форма показалась и в базовом приложении ... пасибо Imikle
2. Ошибка при завершении базового приложения так и осталась (( Поживу - увижу, Доживу - узнаю, Выживу - учту. [P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
|
#4
|
|||
|
|||
Надо смотреть глубже.
Напиши подробнее ошибку. Скорее всего она связана с попыткой удалить уже удаленный объект. Точно у формы нету ни Parent'а, ни Owner'а? |
#5
|
||||
|
||||
Вот исходник 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
|
|||
|
|||
Как форма создается в ДЛЛ?
|
#7
|
||||
|
||||
Код:
settForm := TsettForm.Create(nil); settForm.ShowModal; Поживу - увижу, Доживу - узнаю, Выживу - учту. [P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
|
#8
|
|||
|
|||
А если не используешь эти функции все нормально? Попробуй варианты:
1. Вообще без ДЛЛ (закомментируй все). 2. С ДЛЛ, но не вызывая ничего. И вообще, не вижу смысла в использовании ДЛЛ при статической линковке - это практически тоже самое, что и форма в самом исполняемом модуле, но при этом есть потенциалные проблемы. Если уж делать линковку - то динамическую (через LoadLibrary). Тогда можно динамически менять ДЛЛ (например, через настройку имени библиотеки). |
#9
|
||||
|
||||
Доброго дня...
1. Линковка будет динамическая (это она пока статическая). 2. С проблемкой разобрался. Оказалось, что это из-за присутствия в базовом приложении компонента XPManifest. Убираю компонент и все работает отлично. Но надо , чтобы компонент остался и при этом все работало без ошибок. Подскажите, пожалуйста, как это можно сделать??? Поживу - увижу, Доживу - узнаю, Выживу - учту. [P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
|
#10
|
||||
|
||||
У меня такая же бяка была с XPManifest. Видел бы раньше темку ответил бы сразу. Мучился, мучился так ничего и не намучал, незнаю почему из за этого овозникает ошибка. Сам хочу узнать
|
#11
|
|||
|
|||
А какая дельфя?
У мня на 7-ке все ок. Правда я не кладу манифест на форму из ДЛЛ. Она стиль автоматом подцепляет из самого приложения. |
#12
|
||||
|
||||
Делфя 7.
Я манифест кладу на главной программе, которая вызывает форму из DLL. Поживу - увижу, Доживу - узнаю, Выживу - учту. [P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
|
#13
|
|||
|
|||
Странно. Ну выкладывай проект целиком (в архиве). Будем смотреть.
|
#14
|
||||
|
||||
Исходники проэкта
Я обрезал проэкт до возможного (рабочего) минимума. Сейчас он работает нормально, но стоит вставить туда ХР Манифест, как появится ошибка. Исходник проэкта состоит из 2х частей. Исходник ДЛЛ в отдельном архиве.
Поживу - увижу, Доживу - узнаю, Выживу - учту. [P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Последний раз редактировалось Yurk@, 16.08.2009 в 16:39. |
#15
|
||||
|
||||
У тебя были ошибки при подключении длл (в длл проекте функция выглядела как "CreateDLLForm(App: Pointer);" а в программе "CreateDLLForm; stdcall;").
Я немного переделал проекты. Вроде все работает, но я изменил вид длл'ной формы на диалог и подключается она теперь динамически. |