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

Вниз

падение программы при выгрузке DLL ки....   Найти похожие ветки 

 
casper24   (2004-12-15 04:03) [0]

при открытии DLL (Loadlibrary)

в процедуру библиотеки передаю указатель на процеду в основной программе. Для "общения" между библиотекой и основной программой.

DLL
------

var
MainProcedure:Procedure (p:pchar);
...
procedure Open(Proc:Pointer);
begin
...
@MainProcedure:=Proc;
...
end;

Допустим
при выполнении в библиотеки
MainProcedure("OK")
основная программа "понимает" что какие-то функции выполнины успешны...

Основная программа
-------------------

procedure GetDataFormDll(p:pchar) //процедура обработки данных от DLL
begin
....
if strpas(p)="OK"
then showmessage("все нормально");
..
end;

//вот здесь происходит загрузка и передача указателя процедуры в DLL
procedure LoadDLL;
begin
@open:=nil;

DLLhandle:=Loadlibrary("my.dll");
if dllhandle>=32 then begin
open:=GetProcAddress(dllHandle,"Open");
if open<>nil then
Open(@GetDataFromDLL);
end;
end;


Так вот все бы нормально, работает стабильно, НО ...
в один прекрасный момент надо чтобы основная программа выгрузила библиотеку по команде из этой самой DLL.

Допустим....

DLL
----------------
ModuleProcedure("KILL");

Основная программа
---------------------------
procedure GetDataFromDll(p:pchar);
begin
...
if strpas(p)="KILL" then
FreeLibrary(DllHandle);
...
end; <- и вот при трасировке на этом месте происходит конкретный упад и библиотеки и основной программы.

я вприципе понимаю почему, т.е. процедуру GetDataFromDll я вызываю из процедуры, после ее завершения должна продолжится dll... а она тут опа и выгружается... т.е. программа продолжается "в никуда".
Как избежать такого дела, не меняя системы передачи данных?

PS: ой как не хочется пользоваться сообщениями...ужас...


 
casper24   (2004-12-15 04:05) [1]

я вприципе понимаю почему, т.е. процедуру GetDataFromDll я вызываю из DLL, после ее завершения должна продолжится dll... а она тут опа и выгружается... т.е. программа продолжается "в никуда".

описАлся... сорри


 
Юрий Зотов ©   (2004-12-15 04:22) [2]

> ой как не хочется пользоваться сообщениями...ужас...

А, пожалуй, это и есть самое простое решение - из GetDataFromDll вызвать PostMessage, а в обработчике уже выгружать DLL.


 
SVM (Perm)   (2004-12-15 09:09) [3]

DLLhandle:=Loadlibrary("my.dll");
if dllhandle>=32 then ...

Это почему так?


 
Leonid Troyanovsky ©   (2004-12-15 09:59) [4]


> casper24   (15.12.04 04:03)  

> в процедуру библиотеки передаю указатель на процеду в основной
> программе. Для "общения" между библиотекой и основной программой.
..
> Как избежать такого дела, не меняя системы передачи данных?


Менять, все равно, придется.
Сделать можно так. Приложение, загрузив библиотеку,
вызывает из нее функции, содержащие параметр  var CanUnloadNow: LongBool
(или, скажем,  var NextStep: Longint).
После вызова любой из функций библиотеки приложение
анализирует возвращаемый результат и выгружает библиотеку
при необходимости.

--
С уважением, LVT


 
casper24   (2004-12-15 11:36) [5]

а есть какие-то способы во время работы процедуры GetDataFromDll не доводить выполнения до стройки "end;"
а как-то убивать ее...


 
casper24   (2004-12-15 11:50) [6]

вопрос!!!!

А что есть при компаде "KILL" процедура основной программы
GetDataFromDll посылается самой себе PostMessage и там уже обрабатывает ее на удаление?

ща пойду реализовывать...


 
Digitman ©   (2004-12-15 12:50) [7]


> casper24   (15.12.04 11:36) [5]
> а есть какие-то способы во время работы процедуры GetDataFromDll
> не доводить выполнения до стройки "end;"
> а как-то убивать ее...


не занимайся ерундой.
за строкой "end", возможно, скрывается не одна-единственная маш.инструкция, сгенерированная компилятором.

посылка/обработка асинхронного сообщения, о которой упомянул ЮЗ в [2] - простейшее и наилучшее решение задачи.


 
Leonid Troyanovsky ©   (2004-12-15 20:57) [8]


> casper24   (15.12.04 11:36) [5]
> а есть какие-то способы во время работы процедуры GetDataFromDll
> не доводить выполнения до стройки "end;"
> а как-то убивать ее...


Если само приложение дельфийское, то прервать выполнение
кода в библиотеке (или в том коде, который вызывается ею из
приложения, т.е. GetDataFromDll) можно процедурой Abort.

Т.е., в приложении достаточно сделать:


var
  lib: THandle;
begin
  lib := LoadLibrary();
  @initdll := GetProcAddress(..);
  @p1 := GetProcAddress(..);
  @p2 := GetProcAddress(..);
  ..
  try
    initdll(@GetDataFromDll); // передаем адрес callback
    p1(..); // вызов библиотечной функции
    p2(..); // вызов библиотечной функции
    ..
  finally
    FreeLibrary(lib);
  end;

--
С уважением, LVT.


 
Юрий Зотов ©   (2004-12-17 02:58) [9]

> casper24   (15.12.04 11:50) [6]

Сорри, а Вы ответы читаете?


 
casper24   (2004-12-17 21:47) [10]

Юрий Зотов ©

прошу прощения... не увидел...

реализовал,

но вот проблема, все равно слетает... :(


 
Leonid Troyanovsky ©   (2004-12-18 14:08) [11]


> casper24   (17.12.04 21:47) [10]

> прошу прощения... не увидел...
> реализовал,

> но вот проблема, все равно слетает... :(


Кривая реализация, вот и слетает.

--
С уважением, LVT.


 
SammIk ©   (2004-12-18 20:11) [12]

Скорее всего слетает из-за того, что:
1- Вызываешь из длл ф-ю в основном модуле.
2- выгружаешь либу
3- Из процедуры в основном модуле идет возврат, по адресу
процедуры в длл"ке. НО ТАМ УЖЕ ничего НЕТ(((
-----------
Простыми средствами из этои ситуации не выбратся(((
Тока если сделать так
UINT_PTR SetTimer(
 HWND hWnd,              // handle to window
 UINT_PTR nIDEvent,      // timer identifier
 UINT uElapse,           // time-out value
 TIMERPROC  // timer procedure
);
Где lpTimerFunc   - указательна твою процедуру


 
Leonid Troyanovsky ©   (2004-12-18 20:36) [13]


> SammIk ©   (18.12.04 20:11) [12]
> Скорее всего слетает из-за того, что:
> 1- Вызываешь из длл ф-ю в основном модуле.
> 2- выгружаешь либу
> 3- Из процедуры в основном модуле идет возврат, по адресу
> процедуры в длл"ке. НО ТАМ УЖЕ ничего НЕТ(((
> -----------
> Простыми средствами из этои ситуации не выбратся(((


Ясен пень. В такую ситуацию проще не забираться.
Т.е., выгружать ее надо после возврата из функции.
Чего уж проще?

--
С уважением, LVT.


 
casper24   (2004-12-19 17:21) [14]

все ок разобрался!
ВСЕМ СПАСИБО!

Реализовал callback ф-цию + PostMessage - работает как часы...


 
SammIk ©   (2004-12-19 18:01) [15]

Можно и стек править.
Та чтоба в бабку или пробабку отпровляла.
Или в другую ф-ю.



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

Форум: "WinAPI";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.049 c
6-1101212900
BFG9k
2004-11-23 15:28
2005.02.06
idFTP - ошибка соединения с сервером


3-1104784140
denisych
2005-01-03 23:29
2005.02.06
Как избежать исключения?


1-1106259842
Bobby Digital
2005-01-21 01:24
2005.02.06
StringGird pt2


3-1105376222
chir
2005-01-10 19:57
2005.02.06
OnChange - кто вызывает?


4-1103486999
dimonf
2004-12-19 23:09
2005.02.06
Перехват нажатия копирования в Clipboard и вставки из него!





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