Delphi 메시지 메커니즘 탐색 2
                                            
 12799 단어  직장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                    :             ,         。 
                이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
양식 제출 후 제출 버튼 비활성화텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.