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

Вниз

формы в DLL и как с ними бороться   Найти похожие ветки 

 
dj next   (2003-03-13 17:32) [0]

Товарисчи!
Ж..а в следующем:
Некое приложение подгружает динамически DLL в которой
создаётся некая форма
После работы с ПРИЛОЖЕНИЕМ то бишь при его закрытии
возникает какой-то страшенный ЭКСЕПШН да не один а сразу много
(2 обычно) Обычно - потому что каждый раз по-разному!
Подозреваю что дело в ресурсах но что делать незнаю
Поможите плз чем могете!


 
mrcat   (2003-03-13 17:46) [1]

могу помочь финансами, но не хочу...


 
dj next   (2003-03-13 17:53) [2]

Неужели кроме финансов и помочь нечем?


 
Игорь Шевченко   (2003-03-13 17:55) [3]

Тейксейра, Пачеко: "Delphi 5, руководство разработчика"


 
dj next   (2003-03-13 18:02) [4]

Ладно хоть не букварь(


 
AlexanderSK   (2003-03-13 18:34) [5]

Покажи код открытия Dll и код закрытия Dll!


 
dj next   (2003-03-13 19:31) [6]

Открываю: h:=LoadLibrary(тра-ля-ля);
Закрываю: FreeLibrary(тра-ля-ля);
Удивительно но факт)


 
dj next   (2003-03-13 19:32) [7]

тока во второй строке не тра-ля-ля а h


 
Digitman   (2003-03-14 09:19) [8]


> какой-то страшенный ЭКСЕПШН


конечно - страшенный ! у него ни класса нет, ни текста сообщения об ошибке, ни адреса - ни-че-го !
вот ведь беда какая)... путь тут один - веревка и мыло)


 
dj next   (2003-03-14 10:05) [9]

смешно?
Короче, как правильно освободить ресурсы в DLL?


 
dj next   (2003-03-14 10:07) [10]

по понятиям чиста))


 
NailS   (2003-03-14 10:07) [11]

http://www.delphikingdom.com/helloworld/plugins.htm


 
Digitman   (2003-03-14 10:19) [12]


> dj next


Смешно, говоришь ?
Нет, не смешно ... Грустно !

Грустно от того, что взялся ты за не самую простую задачу, а элементарных вещей не знаешь.

Если уж ты получил сообщение об исключении, потрудись хотя бы точно, кратко и внятно описать его, коль сам не в состоянии сообразить и просишь помощи ! Дискуссия по вопросу твоему по сей момент выглядит не более как обсуждение письма Ваньки Жукова на деревню дедушке.

Еще раз заостряю твое внимание - исключение имеет вполне определенные признаки, которые ты видишь на экране, как минимум - текст сообщения. так вот и будь столь любезен - приведи ДОСЛОВНЫЕ тексты получаемых исключений, при каких условиях эти исключения возникают. Телепатов здесь нет !


 
dj next   (2003-03-14 10:31) [13]

Access violation
изредка Too many concursive exceptions


 
dj next   (2003-03-14 10:32) [14]

Возникает тока если создаю форму
если не создаю всё ок


 
Digitman   (2003-03-14 10:40) [15]


> dj next


Ну что ты как детский ребенок-то ?
Access violation ... дальше-то что в сообщении ? Дословно ? Это ж не для Пушкина сообщение - для тебя !!!! Чтобы ты смог по этой инф-ции отыскать точное место в коде, где происходит исключение !


 
Anatoly Podgoretsky   (2003-03-14 10:47) [16]

Брось ты это дело


 
Digitman   (2003-03-14 11:09) [17]


> Anatoly Podgoretsky


Гнилое, думаешь ?)


 
dj next   (2003-03-14 11:13) [18]

004066B1 6800040000 push $00000400
малый дамп не привести?


 
Digitman   (2003-03-14 11:17) [19]


> dj next


хочешь сказать - AV at address 004066B1... ? Быть того не может, эта операция не может вызвать AV


 
dj next   (2003-03-14 11:28) [20]

гадом буду
функцыя SetString в system


 
Danilka   (2003-03-14 11:29) [21]

dj next (14.03.03 11:28)
только не надо быть гадом, их и так слишком много.


 
dj next   (2003-03-14 11:32) [22]

о нашел пардон
ошибка в RtlFreeHandle в ntdll


 
Digitman   (2003-03-14 11:33) [23]


> гадом буду


обязательно будешь) ... пока не умеришь свои публичные упражнения в жаргоне дворовом !


а вот и SetString (D5)

procedure _SetString{var s: ShortString: buffer: PChar; len: Integer};
asm
{ -> EAX pointer to string }
{ EDX pointer to buffer }
{ ECX len }

MOV [EAX],CL
TEST EDX,EDX
JE @@noMove
XCHG EAX,EDX
INC EDX
CALL Move
@@noMove:
end;


что-то не вижу я здесь никаких push"ей)


 
dj next   (2003-03-14 11:33) [24]

(а первая черт с ней)
ну и чего это за RtlFreeHandle?


 
Digitman   (2003-03-14 11:38) [25]


> dj next


Не городи ерунды ! По адресам 004XXXXX никаких NTDLL быть не может, это - ВАП, распределенное под прикладной код приложения, а не под сист.библиотеку


Ищи строчку прикл.кода (search | find error)


 
dj next   (2003-03-14 11:43) [26]

неа адрес уже другой - 77f84C1C
а тот хрен с ним горворю ж



 
Ihor Osov'yak   (2003-03-14 11:44) [27]

2 Digitman © (14.03.03 11:17)

А почему же? Если указатель стека перед этим хр.. знает куда натравить? Не умышленно, конечно. А по причине ОЧеньУМЕЛЫХ ручек в комбанации с нежеланием книжки читать..


 
Digitman   (2003-03-14 11:54) [28]


> Ihor Osov"yak


При такой постановке вопроса это надо быть я не знаю кем, чтобы ничерта не понимать в принципах отладки Делфи-проектов и, в то же время, отлично ориентироваться в маш.коде, asm"е и манипулировать стеком "вручную")


Согласен, но вероятность сего настолько мизерна, что даже не стоит рассматривать всерьез


 
dj next   (2003-03-14 12:02) [29]

При чем тут принципы отладки?!
Проблема - СТАНДАРТНАЯ
каким образом освободить ресурсы занимаемые в DLL а конкретно
ФОРМУ чтоб не глючило и сидя в Delphi
Вы ж мастера типа ДОЛЖНЫ знать каким образом D распоряжается ресурсами и как их нужно освобождать в какой последовательности и т д ...блин


 
stone   (2003-03-14 12:07) [30]

dj next (14.03.03 12:02)

Ты дурак или прикидываешься. Тебе же ясно сказали покажи код вызова и освобождения DLL, не только строчку FreeLibrary, а всю процедуру. Или ты думаешь что тут все телепаты? Я просто уверен, что проблема в кривых руках.


 
Digitman   (2003-03-14 12:09) [31]


> При чем тут принципы отладки?!
> Проблема - СТАНДАРТНАЯ


При том, что, search | find error, указывающий на некий адрес ВАП, распределенном под твою DLL, покажет строчку, исключение при выполнении которой является первичным, все последующие исключения - лишь следствие первого.
вот твоя задача и состоит в том, чтобы, пользуясь встроенным отладчиком, локализовать эту строчку ! а мы уж тут иссследуем проблему при ее выполнении и дадим соотв.рекомендации


 
Ihor Osov'yak   (2003-03-14 12:19) [32]

2 Digitman © (14.03.03 11:54)

> Согласен, но вероятность сего настолько мизерна, что даже не стоит рассматривать всерьез

Да нет, вот схема довольно вероятной ошибки: делаем move по "левому указателю", или тривиальное присваивание по такому же левому типизированому указателю, который случайно на область стека смотрит, "случайно" затираем адрес возврата с процедуры, как следствие после выхода с процедуры управление получает "левый код" (конечно, av уже можно здесь получить.. но может и пронести и удачно передать управление хр.. знает куда)... Ну а там в том коде какая-то химия с esp... Ну и далее тоже с определенной вероятностью имеем av на безобидном push...

Согласен, маловероятно, но при особом стараниии иногда можно нарваться...

ЗЫ - хотя в хазаина ветки проблема вероятнее всего не в том..

Зы2 - несколько лет назад наблюдал ситуацию, когда по похожей схеме один программер затирал стек возврата только в случае определенных входных данных.. А программа у него уже работала почти полгода... Но вот пошли специфичиские данные...
Конечно, компилятор ему давал предупреждение, что указатель может быть неинициализирован.. Но разве "прохвесионалы" на варнинги и хинты смотрят :-)


 
Digitman   (2003-03-14 12:24) [33]


> Ihor Osov"yak


Да ладно тебе !) Какой там move() у автора может быть, если он элементарно не понимает, где, что, как и в какой последовательности у него происходит - то ли в хост-процессе то ли в библ-ке... сиди тут и гадай)))


 
dj next   (2003-03-14 12:25) [34]

1. есть форма. в unit"е. класс скажем TZHOPA и переменная там же
var ZHOPA: TZHOPA; // unit UZHOPA.PAS
2. есть DLL
там написано что-то типа:

uses UZHOPA;
...
procedure fuck_on(...
begin
ZHOPA:=TZHOPA.Create(nil);

тра-ля-ля...

ZHOPA.Release;
ZHOPA:=nil;
end;

3. есть приложение где есть строки типа:
procedure TModule.MLoad;
begin
h:=LoadLibrary...
@proc:=GetProcAddress...

(есть всяко что-то вроде типа модуля TModule где
хранится хэндл и указатели на процедуры

end;
...и в конце концов ентот Module ..

Module.Unload где Unload

procedure TModule.Unload;
begin
FreeLibrary(Self.h);
end;
УСЁ. Теперь ФАБУЛА:
запускаем приложение вызываем модуль
модуль грузится форма появляется
работаем с формой закрываем её нафик
сидим ещё полчаса пьём кофе
тыкаем закрыть приложение - ВОТ ТУТ И НАЧИНАЕТСЯ САМОЕ ИНТЕРЕСНОЕ
Понятно?


 
Ihor Osov'yak   (2003-03-14 12:27) [35]

2 dj next (13.03.03 17:32)

Прочитай еще раз внимательно Digitman © (14.03.03 10:19)

Задача в принціпе не столь сложная, но по пути есть несколько грабель... А гадать на которые ты наступил - нет исходных данных
и желания...

Зы - формы в dll пихать пока не будет четкого понимания что там в VCL происходит, имхо, не стоит...


 
Ihor Osov'yak   (2003-03-14 12:39) [36]

2 dj next (14.03.03 12:25)

Блин. Ты уже ...


С твоего примера даже не понятно отображаешь ты форму модально или нет. Для длл это существенно. Не понятно, как ты уничтоженшь форму и сколько раз ты делаешь это...

Особое умыление также вызывает ZHOPA.Release;
После этого есть желание послать только к читанию книжек. А когда просветление настанет, то можно тогда и разговор продолжить. Но вероятнее всего, что к тому времене ты и сам разберешся. Если просветление настанет...

Сорри за резкость тона..


 
Digitman   (2003-03-14 12:41) [37]

ба, да тут еще и интерфейсы !!!!!

сразу - страшное подозрение :

procedure fuck_on(...
begin
ZHOPA:=TZHOPA.Create(nil); // refcount = 1 ?

тра-ля-ля... // refcount вряд ли изменился

ZHOPA.Release; // refcount = 0, тут же - destroy
ZHOPA:=nil; // а вот здесь, чует мое сердуе, - и AV родимый сидит !
end;


 
dj next   (2003-03-14 12:45) [38]

1. форма не модальная
2. из примера ВИДНО что создаётся и убивается столько раз сколько
обращений к функции fuck_on
3 Про Release прочитал в Кулибе (Статейка про ресурсы в DLL)
Можно поставить Free - жопа та же

PS
Пусть будет резкость
в тему бы только
а не просто от не...я делать


 
Anatoly Podgoretsky   (2003-03-14 12:48) [39]

Digitman © (14.03.03 11:09)
Не то что бы гнилое, но проблем хватает, особенно если нет понимания и нужды


 
Digitman   (2003-03-14 12:50) [40]


> прочитал в Кулибе


а в той же "Кулибе" ты не удосужился прочитать хоть что-то про обработку исключений ? про try..except ?

хоть бы тело своей подозрительной fuck_on() на время отладки защитил этим блоком)... нет ведь ! гораздо познавательней изощряться в жаргоне и изобретении дурацкизх идентификаторов а-аля ZHOPA, fuck_on e.t.c.



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

Форум: "Потрепаться";
Текущий архив: 2003.03.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.011 c
14-100381
JibSkeart
2003-03-07 17:49
2003.03.31
Может кто то видел но все же это довольно круто


7-100501
Skywalker
2003-02-05 18:04
2003.03.31
Громкость


8-100344
Vit1251
2002-12-23 16:06
2003.03.31
Как проиграть файл MIDI без использования формы


6-100358
Алексей Ч.
2003-01-25 02:11
2003.03.31
ICQ


8-100333
Yury
2002-12-26 11:29
2003.03.31
Video files





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