Delphi 메시지 메커니즘 탐색 2

, TWinControl ( ), Windows TWinControl . FObjectInstance, FObjectInstance TWinControl . MainWndProc 。 VCL Windows 。 , ,Windows HWND 。 Delphi TWinControl . Handle ( protected WindowHandle) 。Windows TMessage Result。     , DispatchMessage TWinControl . MainWndProc ( FObjectInstance . Code ):     DispatchMessage(&Msg)    // Application.Run DispatchMessage                           // Windows     Windows TWinControl . FObjectInstance :              push LPARAM              push WPARAM              push UINT              push HWND              push (eip . Next)             ; Windows                                          ;              jmp FObjectInstance . Code    ; TWinControl . FObjectInstance     FObjectInstance . Code call : call ObjectInstance . offset                push eip . Next              jmp InstanceBlock . Code      ; InstanceBlock . Code     InstanceBlock . Code:              pop ecx                     ; eip . Next ecx,                                          ; @MainWndProc Self              jmp StdWndProc              ; StdWndProc     StdWndProc : function StdWndProc(Window: HWND; Message, WParam: Longint ;    LParam: Longint ): Longint ; stdcall; assembler; asm              push ebp              mov ebp, esp          XOR      EAX,EAX              xor eax, eax          PUSH    EAX              push eax                    ; Message . Result := 0          PUSH    LParam                  ; Borland              push dword ptr [ebp+ $14 ]    ; push ?          PUSH    WParam                  ; TMessage Result              push dword ptr [ebp+ $10 ]    ; , HWND          PUSH    Message                 ; , 。              push dword ptr [ebp+ $0c ]          MOV     EDX,ESP              mov edx, esp                ; Message                                          ; MainWndProc          MOV     EAX,[ECX]. Longint [ 4 ]              mov eax, [ecx+ $04 ]          ; Self MainWndProc          CALL    [ECX]. Pointer              call dword ptr [ecx]        : TWinControl . MainWndProc(Self,                                          ; @Message)          ADD     ESP, 12              add esp, $0c          POP     EAX              pop eax end ;              pop ebp              ret $0010              mov eax, eax     , 。     =============================================================================== ⊙ :TWndMethod =============================================================================== MakeObjectInstance(MainWndProc) MakeObjectInstance。 TWndMethod VCL 。        TWndMethod = procedure ( var Message: TMessage) of object ;     :TWndMethod , TMessage , , ( object related) 。TWndMethod , 8 。TWndMethod 。 :    var      SomeMethod: TWndMethod;    begin      SomeMethod := Form1 . MainWndProc; // 。 SomeMethod MainWndProc                                       // Form1 , SomeMethod(Msg)                                       // 。      SomeMethod := TForm . MainWndProc; // ! 。    end ;        TWndMethod ? :    var      SomeMethod: TWndMethod;    begin      SomeMethod := Form1 . WndProc;  // TForm.WndProc    end ;     , SomeMethod Form1 WndProc Form1 。 。 SomeMethod(Message) Form1 . WndProc(Message)。     , ( function ), ( procedure )。 , TWndMethod , 。     =============================================================================== ⊙ VCL TWinControl . MainWndProc =============================================================================== Application . Run、TWinControl . Create、TWinControl . Handle TWinControl . CreateWnd , VCL 。VCL TWinControl . MainWndProc 。( , 。)     MainWndProc ( ):     procedure TWinControl . MainWndProc( var Message: TMessage); begin    WindowProc(Message); end ;     TWinControl . MainWndProc ( ) TMessage ,TMessage ( WParam、LParam、Result HiWord LoWord , , ):        TMessage = packed record      Msg:    Cardinal ;      WParam: Longint ;      LParam: Longint ;      Result: Longint );    end ;     TMessage , TWinControl . Handle 。TMessage . Msg ID , Windows 、 VCL Control 。WParam LParam Windows wParam lParam ,Result Windows 。     MainWndProc , TWinControl 。( : Borland MainWndProc ?)     MainWndProc , , 。 WindowProc(Message)。WindowProc TControl( TWinControl) ( property ):        property WindowProc: TWndMethod read FWindowProc write FWindowProc;     WindowProc TWndMethod, ( TWndMethod )。 TControl . Create FWindowProc WndProc。     WndProc TControl , TWinControl . MainWndProc :        procedure TControl . WndProc( var Message: TMessage); virtual;     MainWndProc , TControl . WndProc 。     Borland FWindowProc WndProc , WndProc ? 。 TWndMethod ? TWndMethod , , 。 WndProc ( “ / ” “ / ” ), WndProc , TControl WndProc WindowProc , WindowProc , 。     =============================================================================== ⊙ TWinControl . WndProc =============================================================================== , VCL :WndProc 。 ,TWinControl . MainWndProc , WindowProc 。 WindowProc WndProc , WndProc VCL , WindowProc 。      WndProc , TControl , TWinControl 。Borland WndProc , 。         inherited , , , TWinControl TComponent . Create -> TControl . Create -> TWinControl . Create。     WndProc , WndProc 。 TWinControl . WndProc -> TControl . WndProc。     , , WndProc ,   WndProc 。 TWinControl , WndProc , VCL 。     TWinControl . WndProc 、 、 , ,TWinControl . WndProc , TControl . WndProc 。     TWinControl . WndProc :          WM_KEYFIRST .. WM_KEYLAST:        if Dragging then Exit;      // : Exit     : , 。

좋은 웹페이지 즐겨찾기