Освободить память после CreateWindow....

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
Nowichok
Сообщения: 8
Зарегистрирован: 07 дек 2006, 22:49

Есть готовая программа, которая ставит гльобальный хук клавиатурный, след-но библиотека грузится во все процессы, которые того требуют. При загрузке я создаю свой собственный класс, потом на его основе создаю окно через CreateWindowEx. Всё бы ничего, но где-то ошибкА, при водящаю к тому, что при выходе из аськи (к примеру), выдаётся ошибка памяти...вероятно в процессе выгрузки библиотеки из своего АП.
В некоторыз других программах тот же глюк. причём НЕ ВО ВСЕХ ! Отсальные программы нормально работают....в общем где-то видать что-то неправильно делается...и это как эффект "бомбы с часовым механизмом".

Собственно, процесс закрытия программы.
в основной форме :

Код: Выделить всё

 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;
Ну и на всякий сама обработка сообщения моего создаваемого через CreateWindowEx окна (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 секунд после пуска программы. Раньше была ещё и у procedure DLLEntryPoint(dwReason: DWord);, но это приводило тоже к другим глюкам

Я бессилен здесь......Помогите, пожалуйста. Писал прогу почти месяц, многое изучас просто с нуля (в частности и это создание окна). Могу выслать саму программу, чтобы наглядно посмотреть, в чём проблема. Или хотя бы подскажите советом !!!
Nowichok
Сообщения: 8
Зарегистрирован: 07 дек 2006, 22:49

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

Я не понимаю...как ваще доходит до других процессов, что основная прога выгружена, и надо выгрузить из своего АП библиотеку ?? ...я выгружаю библиотеку из основной программы..а как до других программ доходит, что после этого нужно выгрузить и у себя её ? ??
Может выгружаю неправильно....при выходе из самой программы

Код: Выделить всё

 procedure TChange_Volume.FormClose(Sender: TObject; var Action: TCloseAction);
begin
freelibrary(hinstdll);
ExitProcess(0); //по идее и не нужно..но для верности
end;
из других процессов библиотека не выгружается....т.е. нету сигнала о том, чтобы они выгрузили библиотеку....
Ответить