Освободить память после CreateWindow....
Добавлено: 14 дек 2006, 19:43
Есть готовая программа, которая ставит гльобальный хук клавиатурный, след-но библиотека грузится во все процессы, которые того требуют. При загрузке я создаю свой собственный класс, потом на его основе создаю окно через CreateWindowEx. Всё бы ничего, но где-то ошибкА, при водящаю к тому, что при выходе из аськи (к примеру), выдаётся ошибка памяти...вероятно в процессе выгрузки библиотеки из своего АП.
В некоторыз других программах тот же глюк. причём НЕ ВО ВСЕХ ! Отсальные программы нормально работают....в общем где-то видать что-то неправильно делается...и это как эффект "бомбы с часовым механизмом".
Собственно, процесс закрытия программы.
в основной форме :
А вот что в библиотеке :
Ну и на всякий сама обработка сообщения моего создаваемого через CreateWindowEx окна (hwndMain которое)
Директива StdCall стоит только у function MyProc. Если её оттуда убрать, то ошибка выдаётся через 5 секунд после пуска программы. Раньше была ещё и у procedure DLLEntryPoint(dwReason: DWord);, но это приводило тоже к другим глюкам
Я бессилен здесь......Помогите, пожалуйста. Писал прогу почти месяц, многое изучас просто с нуля (в частности и это создание окна). Могу выслать саму программу, чтобы наглядно посмотреть, в чём проблема. Или хотя бы подскажите советом !!!
В некоторыз других программах тот же глюк. причём НЕ ВО ВСЕХ ! Отсальные программы нормально работают....в общем где-то видать что-то неправильно делается...и это как эффект "бомбы с часовым механизмом".
Собственно, процесс закрытия программы.
в основной форме :
Код: Выделить всё
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;
Код: Выделить всё
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;
Я бессилен здесь......Помогите, пожалуйста. Писал прогу почти месяц, многое изучас просто с нуля (в частности и это создание окна). Могу выслать саму программу, чтобы наглядно посмотреть, в чём проблема. Или хотя бы подскажите советом !!!