Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.03;
Скачать: CL | DM;

Вниз

Откуда здесь AV?   Найти похожие ветки 

 
Makhanev A.S. ©   (2004-08-24 19:13) [0]

Создаю свое окно, ниже приведен код процедуры окна:

procedure TMyClass.MyWndProc(var Msg: TMessage);
begin
 case Msg.Msg of
   ...
 else
     Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.WParam, Msg.LParam); //FWindowHandle - хранит handle окна
 end;
end;


очень редко на вызове DefWindowProc при закрытии приложения вылетает AccessViolation.
Не могу понять, откуда оно здесь может взяться.


 
Cobalt ©   (2004-08-24 19:58) [1]

Может, ему присылаются какие левые сообщения? с левыми адресами? Особенно, если ты сам их ему посылаешь.
Или объект уже разрушен - тогда FWindowHandle валит.


 
OSokin ©   (2004-08-24 21:29) [2]

Что за окно? Назови тип и то, что ты хочешь расположить. А то непонятно что получается!


 
Makhanev A.S. ©   (2004-08-24 22:15) [3]

Создаём окно следующим образом:

function CreateInVisibleWindow(const WndClass: string; Method: TWndMethod): HWND;
var
 UtilWindowClass: TWndClass;

 function AllocateWnd(Method: TWndMethod): HWND;
 var
   TempClass: TWndClass;
   ClassRegistered: Boolean;
 begin
   UtilWindowClass.hInstance := HInstance;
 {$IFDEF PIC}
   UtilWindowClass.lpfnWndProc := @DefWindowProc;
 {$ENDIF}
   ClassRegistered := GetClassInfo(HInstance, UtilWindowClass.lpszClassName,
     TempClass);
   if not ClassRegistered or (TempClass.lpfnWndProc <> @DefWindowProc) then
   begin
     if ClassRegistered then
       Windows.UnregisterClass(UtilWindowClass.lpszClassName, HInstance);
     Windows.RegisterClass(UtilWindowClass);
   end;
   Result := CreateWindowEx(WS_EX_TOOLWINDOW, UtilWindowClass.lpszClassName,
     "", WS_POPUP {!0}, 0, 0, 0, 0, 0, 0, HInstance, nil);
   if Assigned(Method) then
     SetWindowLong(Result, GWL_WNDPROC, Longint(MakeObjectInstance(Method)));
 end;

begin
 with UtilWindowClass do
 begin
   style := 0;
   lpfnWndProc := @DefWindowProc;
   cbClsExtra := 0;
   cbWndExtra := 0;
   hInstance := 0;
   hIcon := 0;
   hCursor := 0;
   hbrBackground := 0;
   lpszMenuName := nil;
   lpszClassName := PChar(WndClass);
 end;

 Result := AllocateWnd(Method);

end;

   FWindowHandle := CreateInVisibleWindow("MyWndClass", MyWndProc);


> Cobalt ©   (24.08.04 19:58) [1]
> Может, ему присылаются какие левые сообщения? с левыми адресами?
> Особенно, если ты сам их ему посылаешь.


Шлю я и шлет винда (в основном WM_GETTEXT).
Странно то, что глюк был 1 раз. А этот код тестировался регулярно несколько месяцев.


> Или объект уже разрушен - тогда FWindowHandle валит.

как может валить FWindowHandle? Он же не объект, а HWND = type Longword.


 
GuAV ©   (2004-08-25 02:09) [4]


>      SetWindowLong(Result, GWL_WNDPROC, Longint(MakeObjectInstance(Method)));

А чем бы сразу не задать WindowProc ?
И зачем этот MakeObjectInstance(Method) ? Имхо проще объявить её стандартной:
function MyWindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;


 
Cobalt ©   (2004-08-25 07:42) [5]

Ну дык...
метод - чей? раз
2-е - сюдя по тексту, ты собрался делать собственную обёрткку вместо TWinControl, не зная броду сунулся в воду.

Нафига? Какую ты преследуешь цель?!


 
Cobalt ©   (2004-08-25 07:43) [6]

P.S. Анкету обнови



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

Текущий архив: 2004.10.03;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.024 c
14-1095128166
КаПиБаРа
2004-09-14 06:16
2004.10.03
Вопрос по железу :)


8-1087894955
Borealis
2004-06-22 13:02
2004.10.03
Изображения ключевых кадров из авишки (RIFF_AVI)


8-1088677157
leonidus
2004-07-01 14:19
2004.10.03
Как извлечь информацию из ID тэгов mp3-файлов


14-1093716915
ИМХО
2004-08-28 22:15
2004.10.03
ЛЧ 2004/05


1-1095148299
resut
2004-09-14 11:51
2004.10.03
Не хватает ресурсов