Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.024 c
1-1095410692
Drakosha
2004-09-17 12:44
2004.10.03
TTreeView


14-1095418547
}|{yk
2004-09-17 14:55
2004.10.03
Кто знает, как зайти на ftp сервер с полными правами, если


3-1094166069
fif
2004-09-03 03:01
2004.10.03
базы данных database в сети


4-1093266727
dRake
2004-08-23 17:12
2004.10.03
Список всех файлов в папке


1-1095244558
Максим
2004-09-15 14:35
2004.10.03
DBGrid c FixedCols




   Наверх