• ±ê Ì⣺dz̸VB6ÄæÏò¹¤³Ì(2)
  • ×÷ ÕߣºMengLong
  • ʱ ¼ä£º2004-12-23,10:21
  • Á´ ½Ó£ºhttp://bbs.pediy.com

2. ¸´ÔÓ±äÁ¿µÄÄÚ²¿ÊµÏÖ

    ÕâÀïËùÌáµ½µÄ¸´ÔÓ±äÁ¿(ÎÒ×Ô¼ºµÄ½Ð·¨:) )£¬ÊÇָö¾Ù£¬Êý×éºÍ¼Ç¼ÀàÐ͵ıäÁ¿¡£
    
    
                       1)  Ã¶¾ÙÀàÐ͵ÄʵÏÖ 
  
    Ïȶ¨ÒåÒ»¸öö¾ÙÀàÐÍÈçÏ£º
    Enum myweek
      sun
      mon
      tues
      wednes
      thurs
      fri
      satur
    End Enum
    È»ºóÔÙ±àдһ¶ÎʹÓÃö¾ÙÀàÐ͵ĴúÂ룺
    Dim a As myweek
    Dim b As Integer
    
    a = sun
    b = a
    Print b
    
    Ä¬ÈÏÉèÖñàÒëÕâ¶Î´úÂ룬½Ó×ÅÎÒÃÇ¿´¿´±àÒëÆ÷Éú³ÉÁËʲô¡£
; 37   : Dim a As myweek
; 38   : Dim b As Integer
; 39   : 
; 40   : a = sun
; 41   : b = a

  xor  ecx, ecx                    // a = sun ,¼´ a = 0
  call  DWORD PTR __imp_@__vbaI2I4  // b = a

; 42   : Print b

  push  eax                         // b
  push  esi
  push  OFFSET FLAT:___vba@006255A0
  call  DWORD PTR __imp____vbaPrintObj //Print

        ***************************************************
        ¿ÉÒÔ¿´³ö£¬Ã¶¾ÙÀàÐÍÔÚ´úÂëÀïÊÇÖ±½ÓÓó£Á¿ÊýÖµ´úÌæµÄ¡£
        
        
                       2) Êý×éÀàÐ͵ÄʵÏÖ
                       
    Êý×éµÄ¸ÅÄî±È½Ï¸´ÔÓ£¬ÎªÁËÑо¿·½±ã£¬ÕâÀïÖ»ÌÖÂÛһάÊý×飬²¢ÇÒ²»ÊÇǶÌ׵ġ£                       
    ÏÈ¿´¿´¾²Ì¬Êý×éµÄ¶¨ÒåÓëʵÏÖ¡£
    
    ´úÂ룺
    Dim a(3 To 6) As Integer
    
    ·´»ã±à´úÂ룺
    
004019FF  PUSH 2
00401A01  LEA EAX,DWORD PTR SS:[EBP-2C]   // Êý×é±äÁ¿
00401A04  XOR ESI,ESI
00401A06  PUSH ¹¤³Ì1.00401694             // Ö¸Ïò´úÂë¶Î
00401A0B  PUSH EAX                       
00401A0C  MOV DWORD PTR SS:[EBP-34],ESI
00401A0F  CALL DWORD PTR DS:[<&MSVBVM60.__vbaAryConstruct2>] // ¹¹ÔìÒ»¸öÊý×é

    Ö¸Ðе½ÕâÀïʱ¿´[ebp-2c]µÄÄÚÈÝ£º
    0063F3E4  01 00 92 00 02 00 00 00  .?...
    0063F3EC  00 00 00 00 C0 0F 51 00  ....?Q.
    0063F3F4  04 00 00 00 03 00 00 00  ......
    
    ÕâЩÊý¾Ý³ýÁË63F3F0´¦µÄµØÖ·ÊÇ__vbaAryConstruct2º¯ÊýÌî½øÈ¥µÄ£¬ÆäÓàµÄ¶¼ÊÇ´Ó
401694´¦¿½±´¹ýÀ´µÄ¡£Òò´Ë__vbaAryConstruct2º¯ÊýµÄ×÷ÓÿÉÒÔÕâÑùÀí½â£ºÏÈ´Ó401694
´¦¿½±´24¸ö×Ö½Úµ½ebp-2c´¦£¬È»ºó·ÖÅäÒ»¿é¿Õ¼ä£¬°ÑÖ¸ÏòзÖÅäµÄ¿Õ¼äµÄÖ¸ÕëÌîµ½63F3F0
´¦¡£
    ÄÇôÉÏÃæÕâЩÊý¾Ýµ½µ×ÊÇʲôÒâ˼ÄØ£¿¿´ÏÂÃæµÄ·ÖÎö.


00401A18  PUSH ¹¤³Ì1.00401A30             //Ö¸ÏòÍ˳öµØÖ·
00401A1D  LEA EDX,DWORD PTR SS:[EBP-34]
00401A20  LEA ECX,DWORD PTR SS:[EBP-2C]  //ÒªÊͷŵÄÊý×é±äÁ¿
00401A23  PUSH EDX
00401A24  PUSH 0
00401A26  MOV DWORD PTR SS:[EBP-34],ECX
00401A29  CALL DWORD PTR DS:[<&MSVBVM60.__vbaAryDestruct>]   // ÊÍ·ÅÒ»¸öÊý×é

    ÎªÁËŪÇå³þÉÏÃæÌáµ½µÄÄÇЩÄÚ´æÊý¾ÝµÄº¬Ò壬ÎÒ·Ö±ð¶¨ÒåÁ˲»Í¬´óС²»Í¬ÀàÐ͵ÄÊý×éÀ´±È½Ï£¬
ÏÂÃæÊÇdump³öÀ´µÄµäÐÍÊý¾Ý£º

    Dim a(3 To 6)      
    0063F3E4  01 00 92 08 10 00 00 00  .?...
    0063F3EC  00 00 00 00 2C 01 41 00  ....,A.
    0063F3F4  04 00 00 00 03 00 00 00  ......
               
    Dim a(3 To 6) As String    
    0063F3E4  01 00 92 01 04 00 00 00  .?...
    0063F3EC  00 00 00 00 C0 0F 51 00  ....?Q.
    0063F3F4  04 00 00 00 03 00 00 00  ......                   
                       
    Dim a(3 To 6) As Integer   
    0063F3E4  01 00 92 00 02 00 00 00  .?...
    0063F3EC  00 00 00 00 C0 0F 51 00  ....?Q.
    0063F3F4  04 00 00 00 03 00 00 00  ......
    
    ÎÒ×ܽáµÄÊý×é±äÁ¿ÄÚ´æÊý¾ÝµÄ˵Ã÷£º
    0063F3E4 ´¦µÄÁ½¸ö×Ö½Ú´ú±íÊý×éµÄάÊý
    0063F3E6 ´¦µÄÒ»¸ö×Ö½Ú 92 ´ú±í¾²Ì¬Êý×é
    0063F3E7 ´¦µÄÒ»¸ö×Ö½ÚËæ×Ų»Í¬ÀàÐ͵ıäÁ¿Óв»Í¬µÄ±ä»¯¡£
             08 : ±äÌåÀàÐÍ  
             01 : String
             00 : Integer,byte,long,single,double,date  
    0063F3E8 ´¦µÄÁ½¸ö×Ö½Ú±íʾһ¸öÊý×éÔªËØËùÕ¼µÄÄÚ´æ¿Õ¼ä×Ö½ÚÊý¡£
    0063F3EC ´¦µÄ4¸ö×Ö½Ú×ÜÊÇ0£¬¿ÉÄÜÊÇΪÁ˶ÔÆë¡£
    0063F3F0 ´¦µÄÁ½¸ö×Ö½Ú´ú±í·ÖÅäµÄ¿Õ¼äµÄµØÖ·Ö¸Õ룬¼´Êý×éÊý¾Ý¡£
    0063F3F4 ´¦µÄÁ½¸ö×Ö½Ú´ú±í¾²Ì¬Êý×éÔªËصĸöÊý¡£
    0063F3F8 ´¦µÄÁ½¸ö×Ö½Ú´ú±íÊý×éµÄÆðʼϱꡣ
    
    ÉÏÃæ´ó¸ÅµÄ¶ÔÊý×é±äÁ¿µÄÊý¾Ý×öÁË˵Ã÷£¬ÎªÁËÑé֤һϣ¬ÔÙ¿´Ò»¸ö3άÊý×éµÄ¶¨Òå:
    
    Dim a(1 To 2, 3 To 5, 6 To 9) As Integer
    
    0063F3D4  03 00 92 00 02 00 00 00  .?...
    0063F3DC  00 00 00 00 C0 0F 51 00  ....?Q.
    0063F3E4  04 00 00 00 06 00 00 00  ......
    0063F3EC  03 00 00 00 03 00 00 00  ......
    0063F3F4  02 00 00 00 01 00 00 00  ......

    ¿ÉÒÔ¿´³ö£¬¾²Ì¬Êý×éµÄÐÅÏ¢ÔÚ±àÒëʱ¾Í±»±àÂëµ½ÁË´úÂë¶ÎÀï¡£
    ¾²Ì¬Êý×éµÄ¹¹ÔìÓà __vbaAryConstruct2
    ¾²Ì¬Êý×éµÄÊÍ·ÅÓà __vbaAryDestruct
           
///////////////////////////////////////////////////////////
    
    ¶¯Ì¬Êý×éÓÖÊÇÔõÑùʵÏÖµÄÄØ£¿
    ´úÂë:
    Dim a() As Date
    ReDim a(2 To 5)
    
    ·´»ã±à´úÂë:
004019CF  PUSH 2                          //Æðʼϱê
004019D1  PUSH 5                          //½áÊøϱê
004019D3  PUSH 1                          //Êý×éάÊý
004019D5  LEA EAX,DWORD PTR SS:[EBP-18]
004019D8  PUSH 7                          //±äÁ¿ÀàÐÍ
004019DA  PUSH EAX                        //ÎÒÃÇÖض¨ÒåµÄÊý×é±äÁ¿
004019DB  XOR ESI,ESI
004019DD  PUSH 8                          //Êý×éÔªËØËùÕ¼ÄÚ´æ¿Õ¼äµÄ×Ö½ÚÊý
004019DF  PUSH 80                         //¶¯Ì¬Êý×é±ê¼Ç
004019E4  MOV DWORD PTR SS:[EBP-18],ESI
004019E7  CALL DWORD PTR DS:[<&MSVBVM60.__vbaRedim>] // ReDim
004019ED  ADD ESP,1C
004019F0  MOV DWORD PTR SS:[EBP-4],ESI
004019F3  PUSH ¹¤³Ì1.00401A05
004019F8  LEA ECX,DWORD PTR SS:[EBP-18]   //Êý×é±äÁ¿
004019FB  PUSH ECX
004019FC  PUSH 0
004019FE  CALL DWORD PTR DS:[<&MSVBVM60.__vbaAryDestruct>]  //ÊÍ·ÅÊý×é

    µ±Ö´Ðе½ 004019ED Ê±,ÎÒÃDz鿴[ebp-18]´¦µÄÄÚ´æÊý¾Ý,¿ÉÒÔ¿´µ½ÊÇ
    
0063F3F8  D0 0F 51 00              ?Q.ôø
    
    ÕâÊÇÒ»¸öÖ¸Õë,ÎÒÃǽÓ×Å follow dword in dump,¿ÉÒÔ¿´µ½Êý¾ÝÈçÏÂ:
    
00510FD0  01 00 80 00 08 00 00 00  .€....
00510FD8  00 00 00 00 2C 01 41 00  ....,A.
00510FE0  04 00 00 00 02 00 00 00  ......

    Õâ¸ö½á¹¹ºÍ¾²Ì¬Êý×éµÄ½á¹¹Ã»ÓÐʲô²»Í¬!  ^_^
    Í¬Ê±Ò²¿ÉÒÔ¿´³ö,¶¯Ì¬Êý×éÊǶ¯Ì¬·ÖÅäµÄ,ÕâºÍ¾²Ì¬Êý×éÐÅÏ¢±»±àÒëµ½´úÂë¶ÎÀﲻͬ¡£
    
    ×ܽá:
    ¶¯Ì¬Êý×éµÄReDim(Öض¨Òå)Óà__vbaRedim (×¢:ÕâÊǿɱä²ÎÊýµÄº¯Êý)
    ¶¯Ì¬Êý×éµÄÊÍ·ÅÓà__vbaAryDestruct

///////////////////////////////////////////////////////////
    ÔÙ¿´Ò»Ï³£ÓõÄÊý×é²Ù×÷:  
    ÏÈ¿´Á½¸öº¯Êý,LboundºÍUbound¡£ËüÃǵÄʵÏÖ·Ö±ðÈçÏ£º
    
£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½    
__vbaLbound       ;º¯Êý Lbound ,È¡Êý×éϱêϽç

LEA EAX,DWORD PTR SS:[EBP-2C]   ;²ÎÊý1,Êý×é
PUSH EAX
PUSH 1                          ;²ÎÊý2,Êý×éάÊý
CALL DWORD PTR DS:[<&MSVBVM60.__vbaLboun>;  MSVBVM60.__vbaLbound
                              ;½á¹ûÔÚeaxÖзµ»Ø    
£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½                              
__vbaUbound       ;º¯Êý Ubound ,È¡Êý×éϱêÉϽç

LEA ECX,DWORD PTR SS:[EBP-2C]   ;²ÎÊý1,Êý×é
PUSH ECX
PUSH 1                          ;²ÎÊý2,Êý×éάÊý
CALL DWORD PTR DS:[<&MSVBVM60.__vbaUboun>;MSVBVM60.__vbaUbound
                              ;½á¹ûÔÚeaxÖзµ»Ø
£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½£½
    ÕâÁ½¸öº¯ÊýÔÙ²Ù×÷¶¯Ì¬Êý×éʱ³£Ê¹Óã¬ÕâÀïÏȼÇסËûÃǵÄʵÏÖ·½·¨¡£
    
    »¹ÓÐÒ»¸ö³£Ê¹Óõĺ¯Êý£ºErase ,Õâ¸öº¯ÊýÓÃÀ´ÖØгõʼ»¯¾²Ì¬Êý×éµÄÔªËØ£¬»òÕß
ÊͷŶ¯Ì¬Êý×éµÄ´æ´¢¿Õ¼ä¡£
               
LEA EAX,DWORD PTR SS:[EBP-18]   ;Êý×é±äÁ¿µÄµØÖ·             
PUSH EAX                                     
PUSH EDI                        ;0              
CALL DWORD PTR DS:[<&MSVBVM60.__vbaErase>] ;º¯ÊýErase


    ÏÂÃæ±àдһ¶Î¼òµ¥µÄ´úÂë·ÖÎöÒ»ÏÂ:
    Dim a() As Integer
    ReDim a(2 To 5)
    a(2) = &HAA
    Erase a
    
    Dim b(1 To 3) As Integer
    b(1) = &H55
    Erase b

    ·´»ã±à´úÂëÈçÏÂ:
00401A4F  PUSH 2
00401A51  LEA EAX,DWORD PTR SS:[EBP-30]
00401A54  XOR EDI,EDI
00401A56  PUSH ¹¤³Ì1.004016B8
00401A5B  PUSH EAX
00401A5C  MOV DWORD PTR SS:[EBP-18],EDI
00401A5F  MOV DWORD PTR SS:[EBP-38],EDI
00401A62  CALL DWORD PTR DS:[<&MSVBVM60.__vbaAryConstruct2>] 

/////////////////////////////////////ÉÏÃæÕâ¶ÎÊÇ Dim b(1 To 3) As Integer
         
00401A68  PUSH 2
00401A6A  PUSH 5
00401A6C  PUSH 1
00401A6E  LEA ECX,DWORD PTR SS:[EBP-18]
00401A71  PUSH 2
00401A73  PUSH ECX
00401A74  PUSH 2
00401A76  PUSH 80
00401A7B  CALL DWORD PTR DS:[<&MSVBVM60.__vbaRedim>] 

//////////////////////////////////////ÉÏÃæÕâ¶ÎÊÇ Dim a() As Integer
//////////////////////////////////////          ReDim a(2 To 5)
                
00401A81  MOV ECX,DWORD PTR SS:[EBP-18]
00401A84  ADD ESP,1C
00401A87  CMP ECX,EDI
00401A89  JE SHORT ¹¤³Ì1.00401AB0
00401A8B  CMP WORD PTR DS:[ECX],1
00401A8F  JNZ SHORT ¹¤³Ì1.00401AB0
00401A91  MOV EDX,DWORD PTR DS:[ECX+14]  //È¡³öϱê
00401A94  MOV EAX,DWORD PTR DS:[ECX+10]
00401A97  MOV ESI,2
00401A9C  SUB ESI,EDX
00401A9E  CMP ESI,EAX
00401AA0  JB SHORT ¹¤³Ì1.00401AAB
00401AA2  CALL DWORD PTR DS:[<&MSVBVM60.__vbaGenerateBoundsError>]
00401AA8  MOV ECX,DWORD PTR SS:[EBP-18]
00401AAB  LEA EAX,DWORD PTR DS:[ESI+ESI] //³ËÒÔ2,¼´ÕûÊýËùÕ¼´æ´¢¿Õ¼ä
00401AAE  JMP SHORT ¹¤³Ì1.00401AB9
00401AB0  CALL DWORD PTR DS:[<&MSVBVM60.__vbaGenerateBoundsError>]
00401AB6  MOV ECX,DWORD PTR SS:[EBP-18]

////////////////////////////////////////ÉÏÃæÕâ¶Î°üº¬Á˶ÔÉú³ÉµÄ¶¯Ì¬Êý×éµÄ¼ìÑé

00401AB9  MOV EDX,DWORD PTR DS:[ECX+C]   //È¡³ö±äÁ¿aµÄÖµµØÖ·
00401ABC  MOV ESI,DWORD PTR DS:[<&MSVBVM60.__vbaErase>]               
00401AC2  MOV WORD PTR DS:[EDX+EAX],0AA  //¶ÔµÚÒ»¸öÔªËظ³Öµ

////////////////////////////////////////µ½ÕâÀïÊÇ a(2) = &HAA

00401AC8  LEA EAX,DWORD PTR SS:[EBP-18]
00401ACB  PUSH EAX
00401ACC  PUSH EDI
00401ACD  CALL ESI           

////////////////////////////////////////µ½ÕâÀïÊÇ Erase a
                                        
00401ACF  MOV ECX,DWORD PTR SS:[EBP-24]//È¡µÃ±äÁ¿bµÄÖµµØÖ·
00401AD2  LEA EAX,DWORD PTR SS:[EBP-38]
00401AD5  LEA EDX,DWORD PTR SS:[EBP-30]
00401AD8  PUSH EAX
00401AD9  MOV WORD PTR DS:[ECX],55     

////////////////////////////////////////µ½ÕâÀïÊÇ b(1) = &H55
00401ADE  PUSH EDI
00401ADF  MOV DWORD PTR SS:[EBP-38],EDX
00401AE2  CALL ESI

////////////////////////////////////////µ½ÕâÀïÊÇ Erase b

00401AE4  MOV DWORD PTR SS:[EBP-4],EDI
00401AE7  PUSH ¹¤³Ì1.00401B09
00401AEC  MOV ESI,DWORD PTR DS:[<&MSVBVM60.__vbaAryDestruct>]         
00401AF2  LEA ECX,DWORD PTR SS:[EBP-18]
00401AF5  XOR EDI,EDI
00401AF7  PUSH ECX
00401AF8  PUSH EDI
00401AF9  CALL ESI                     //ÊÍ·Åa                                            
00401AFB  LEA EAX,DWORD PTR SS:[EBP-38]
00401AFE  LEA EDX,DWORD PTR SS:[EBP-30]
00401B01  PUSH EAX
00401B02  PUSH EDI
00401B03  MOV DWORD PTR SS:[EBP-38],EDX
00401B06  CALL ESI                     //ÊÍ·Åb

    ¹ØÓÚÊý×é¾ÍÏÈ·ÖÎöÕâЩ,ºóÃ滹Ҫ·ÖÎöµÄÊÇ For Each .. NextÓï¾äºÍ Arrayº¯Êý,
²»¹ýÕâÁ½¸ö¶¼±È½Ï¸´ÔÓЩ,Ïȷŵ½ºóÃæÈ¥¡£


                     3)½á¹¹ÀàÐ͵ÄʵÏÖ
                     
    VBµÄ¼Ç¼±äÁ¿Æäʵ¾ÍÊÇһЩ×ÓÓòµÄ˳ÐòÅÅÁС£
    
    Õâ¾ä»°ÔõôÀí½âÄØ£¿¿´¿´ÏÂÃæµÄ´úÂ룺
    
    Private Type daterec
        year As Integer
        month As String * 3
        day As Integer
    End Type 
    
    Dim a As daterec
  
    a.year = 2004
    a.month = "Jan"
    a.day = 21    
      
    ·´»ã±à´úÂëÈçÏ£º
004019DF  XOR EAX,EAX
004019E1  LEA ECX,DWORD PTR SS:[EBP-1E]
004019E4  MOV DWORD PTR SS:[EBP-20],EAX
004019E7  PUSH ¹¤³Ì1.004014CC            //"Jan"                
004019EC  MOV DWORD PTR SS:[EBP-1C],EAX
004019EF  PUSH ECX
004019F0  PUSH 3
004019F2  MOV WORD PTR SS:[EBP-18],AX
004019F6  MOV WORD PTR SS:[EBP-20],7D4   // a.year = 2004
004019FC  CALL DWORD PTR DS:[<&MSVBVM60.__vbaLsetFixstr>]//a.month = "Jan"
00401A02  MOV WORD PTR SS:[EBP-18],15    // a.day = 15    

    Ö´Ðе½ÕâÀïʱ¿´ÄÚ´æ[ebp-20]:
0063F3F0  D4 07 4A 00 61 00 6E 00  ?J.a.n.
0063F3F8  15 00 6F 17 F4 F8 63 00  .oôøc.

    ´Ó 0063F3F0 µ½ 0063F3F9 ¾ÍÊǼǼ±äÁ¿ a µÄÖµÁË¡£