Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2006, 21:15   #11
Nowichok
Пользователь
 
Регистрация: 23.11.2006
Сообщений: 53
По умолчанию

Собственно, процесс закрытия программы.
в основной форме :
Код:
 procedure TChange_Volume.FormClose(Sender: TObject; var Action: TCloseAction);
begin
unhookwindowshookex(hookhandle); //убираю ловушку
freelibrary(hinstdll); //освобождаю из памяти мою dll
end;
А вот что в библиотеке :
Код:
 procedure DLLEntryPoint(dwReason: DWord);
begin
  case dwReason of
    DLL_PROCESS_ATTACH:
     begin
      CreateWin;
     end;
    DLL_PROCESS_DETACH:
     begin
      ReleaseDC(hwndMain,HDC);
      DestroyWindow(hwndMain);
      UnRegisterClass(wc.lpszClassName,HInstance); 
     end;
  end;
end;
Ну и на всякий сама обработка сообщения моего создаваемого через CreateWindow окна (hwndMain которое)
Код:
 function MyProc(Window: HWnd; AMessage, WParam, LParam: Longint): Longint; stdcall;
begin
  //подпрограмма обработки сообщений
  case AMessage of
    WM_DESTROY:
    begin
      PostQuitMessage(0);
      Result := 0;
   end;
    wm_Timer:
    begin
     ShowWindow(hwndMain, SW_HIDE);
    end;
    else
      Result := DefWindowProc(Window, AMessage, WParam, LParam);
  end;
end;
Директива StdCall стоит только у function MyProc. Если её оттуда убрать, то ошибка выдаётся через 5 секунд после пуска программы.

Я опять бессилен здесь... Получается, что иногда первой выгружается не сама программа (как правильно должно быть), а библиотека из какого-нибудь процесса...и вылетает ошибка.
Как можно это исправить ?

Последний раз редактировалось Nowichok; 13.12.2006 в 21:20.
Nowichok вне форума Ответить с цитированием
Старый 14.12.2006, 20:23   #12
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

а тебе какой порядок нужен?
rpy3uH вне форума Ответить с цитированием
Старый 14.12.2006, 21:03   #13
Nowichok
Пользователь
 
Регистрация: 23.11.2006
Сообщений: 53
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
а тебе какой порядок нужен?
По идее...при выходе из программы самой (основной), сначала она выгружается..а потом всё выгружается из других процессов. Но видать и не так даже, т.к. ошибки вылазят, когда просто закываю приложение (аську, проигрыватель и т.п.)...в них выскакивает ошибка, а другие (вообще третьи приложения), просто тихо-мирно закрываются (агент например). Где-то видать ошибка в памяти ,которая сразу не видна...а потом даёт о себе знать.

Я могу дать всю программу,дабы понять проблему,там легко разобраться ,ничего сложного нет. Всё откомментированно..
Nowichok вне форума Ответить с цитированием
Старый 15.12.2006, 04:43   #14
Drop
Пользователь Подтвердите свой е-майл
 
Аватар для Drop
 
Регистрация: 14.12.2006
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Nowichok Посмотреть сообщение
По идее...при выходе из программы самой (основной), сначала она выгружается..а потом всё выгружается из других процессов. Но видать и не так даже, т.к. ошибки вылазят, когда просто закываю приложение (аську, проигрыватель и т.п.)...в них выскакивает ошибка, а другие (вообще третьи приложения), просто тихо-мирно закрываются (агент например). Где-то видать ошибка в памяти ,которая сразу не видна...а потом даёт о себе знать.
Во-первых: при нормальном раскладе программа сначала чистит все, что с ней связано (удаляет хуки, выгружает библилотеки), а потом выгружается сама (т.к. если она выгрузится - она уже не работает и следовательно не может выполнять команды).

Во-вторых: любой хук перехватывает сообщения. Также многие программы, поддерживающие плагины (например винамп), используют сообщения. Т.е. суть их плагинов в том, что они принимают сообщения от других программ и реагируют на них. Системное сообщение WM_USER создано специально для этих целей и имеет произвольный код. Если возникает конфликт кодов вылетает ошибка.
Также известны многочисленные глюки при использовании хук'а. Например: во время его работы перехватываемые клавиши залиапли.

Но: Сообщения не единственный путь поддержки плагинов. Поэтому программы поддерживающие плагины другого вида или не поддерживающие плагины - ошибок не выдают.

Рекомендую перед закрытием убивать все хуки и т.д. а потом выгружаться.

Еще ощибка может возникать при попытке хука отдать значение нажатой клавиши несуществующюму (странное получилось слово)))) приложению. Т.е. при установке хука мы указываем хэндл принимающей формы. Если приложение закрылось, а хук остался - он продолжает посылать сообщения с кодом клавишы (без принимающей формы - в никуда).

ИМХО как показывает практика - поблема не в ошибке, а в ее последствиях. Если после убийства вылетит ошибка, которая не на что не влияет, можно использовать:

try
...//код
except
...//обработчик ошибки - можно оставить пустым
end;

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

Последний раз редактировалось Drop; 15.12.2006 в 05:11.
Drop вне форума Ответить с цитированием
Старый 15.12.2006, 20:46   #15
Nowichok
Пользователь
 
Регистрация: 23.11.2006
Сообщений: 53
По умолчанию

ага..поступил, как предложили - стал сначала выгружать хук при выгрузке самой библиотеки. В Delphi перестала вылетать ошибка -кул. Но эт не всё.
Обнаружилось, что при выходе из основной программы, она выгружает из своего АП библиотеку...а в других процессаах она висит..это вполне могло быть всему причиной.

Я не понимаю...как ваще доходит до других процессов, что основная прога выгружена, и надо выгрузить из своего АП библиотеку ?? ...я выгружаю библиотеку из основной программы..а как до других программ доходит, что после этого нужно выгрузить и у себя её ? ??
Может выгружаю неправильно....при выходе из самой программы
Код:
 procedure TChange_Volume.FormClose(Sender: TObject; var Action: TCloseAction);
begin
freelibrary(hinstdll);
ExitProcess(0); //по идее и не нужно..но для верности
end;
из других процессов библиотека не выгружается....т.е. нету сигнала о том, чтобы они выгрузили библиотеку....
Nowichok вне форума Ответить с цитированием
Старый 16.12.2006, 09:03   #16
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

чей пускай висит в другихпроцессах жалко что ли
главное что бы она перестала хук обрабатывать

Последний раз редактировалось rpy3uH; 16.12.2006 в 09:05.
rpy3uH вне форума Ответить с цитированием
Старый 16.12.2006, 09:09   #17
Nowichok
Пользователь
 
Регистрация: 23.11.2006
Сообщений: 53
По умолчанию

Цитата:
Сообщение от Nowichok Посмотреть сообщение
ага..поступил, как предложили - стал сначала выгружать хук при выгрузке самой библиотеки.
т.е. если библиотека не выгружена, то и хук не выгружен !!!!! Да и в принципе это некрасивый стиль программирования получается. Если библиотека висит, значит dll-файл нельзя удалить (к примеру)...это уже нехорошо.

Последний раз редактировалось Nowichok; 16.12.2006 в 09:11.
Nowichok вне форума Ответить с цитированием
Старый 16.12.2006, 16:34   #18
Drop
Пользователь Подтвердите свой е-майл
 
Аватар для Drop
 
Регистрация: 14.12.2006
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Nowichok Посмотреть сообщение
т.е. если библиотека не выгружена, то и хук не выгружен !!!!! Да и в принципе это некрасивый стиль программирования получается. Если библиотека висит, значит dll-файл нельзя удалить (к примеру)...это уже нехорошо.
чет я наверно торможу... каким образом она попадает в другие поцессы, если ты загружаешь ее только в свое приложение?
какой вопрос, такой ответ..
Drop вне форума Ответить с цитированием
Старый 16.12.2006, 16:37   #19
Nowichok
Пользователь
 
Регистрация: 23.11.2006
Сообщений: 53
По умолчанию

хмм...с этим сам слабо разобрался. Глобальный хук ставится на все процессы, хук должен ОБЯЗАТЕЛЬНО быть описан в библиотеке. А каким образом он грузится в процесс - мне не низвестно. Создал новую ветку по этой тематике в разделе Delphi->Общее (вроде)
Nowichok вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание новых таблиц в Access через Delphi mopozoff БД в Delphi 25 05.12.2009 20:18
Создание кнопки зная HWND окна(рабочий стол) WOLFak Компоненты Delphi 1 07.04.2008 07:45
Создание окна при получение определенного пакета GHOST_Kasper Общие вопросы Delphi 5 06.02.2008 13:01
Создание обьектов файловой системы через делфи BETONOMESHALKA Общие вопросы Delphi 2 26.12.2007 22:17
создание cgi для сохранения на сервере exe файла преданного через http L0rD Работа с сетью в Delphi 2 22.06.2007 12:52