![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Откуда здесь AV? [D7, WinXP]
Makhanev A.S. © (2004-08-24 19:13:00)Создаю свое окно, ниже приведен код процедуры окна:
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-25 07:43:00) [1]P.S. Анкету обнови
Cobalt (2004-08-25 07:42:00) [2]Ну дык...
метод - чей? раз
2-е - сюдя по тексту, ты собрался делать собственную обёрткку вместо TWinControl, не зная броду сунулся в воду.
Нафига? Какую ты преследуешь цель?!
GuAV (2004-08-25 02:09:00) [3]
> SetWindowLong(Result, GWL_WNDPROC, Longint(MakeObjectInstance(Method)));
А чем бы сразу не задать WindowProc ?
И зачем этот MakeObjectInstance(Method) ? Имхо проще объявить её стандартной:
function MyWindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
Makhanev A.S. (2004-08-24 22:15:00) [4]Создаём окно следующим образом:
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.
OSokin (2004-08-24 21:29:00) [5]Что за окно? Назови тип и то, что ты хочешь расположить. А то непонятно что получается!
Cobalt (2004-08-24 19:58:00) [6]Может, ему присылаются какие левые сообщения? с левыми адресами? Особенно, если ты сам их ему посылаешь.
Или объект уже разрушен - тогда FWindowHandle валит.