VB6의 LSet 및 RSet 설명

5408 단어 VBLSetRSet
VB6에는 Let, Set, LSet, RSet과 비슷한 몇 가지 문구가 있습니다.
일반 변수에 대한 Let 값 지정:

[Let] varname = expression
대부분의 경우 우리는 Let을 생략하고 직접 등호로 값을 부여해서 많은 사람들이 Let의 존재를 전혀 모른다.
Set는 대상의 값을 부여하는 데 사용되며 변수를 대상을 가리키고 대상의 인용 계수를 증가시킨다. 인용 계수가 무엇인지 모르는 사람도 적지 않다.
그럼 LSet은 뭐 하는 거예요?어떻게 보면 Let과 Set의 결합체인 것 같지만 사실은 그렇지 않다.LSet의 L은 Left의 약자이며 그에 대응하는 것은 Rlet입니다.L이 Left의 줄임말인 줄 어떻게 알았냐고요?문서에 쓴 거지:

LSet Statement

Left aligns a string within a string variable, or copies a variable of one user-defined type to another variable of a different user-defined type.

RSet Statement

Right aligns a string within a string variable.

LSet은 RSet보다 기능이 하나 더 많습니다. 이것을 보지 않고 같은 부분을 먼저 보십시오. 두 가지는 각각 문자열 변수에서 문자열을 왼쪽으로 정렬하는 데 사용됩니다.무슨 뜻이죠?사실 문서만 봐도 잘 모르겠어요. 실제로 테스트해 보세요.

Sub Main()
    Dim url As String
    Dim s As String
   
    Let url = "https://www.jb51.net"
    s = String$(20, "*")
   
    LSet s = url
    Debug.Print s
   
    RSet s = url
    Debug.Print s
End Sub
출력(스페이스 바 참고):

https://www.jb51.net    

     https://www.jb51.net

 
확실히 왼쪽으로 정렬된 오른쪽으로 정렬하고, 또 이런 식으로 우리의 별표 *를 빈칸으로 바꾸면 무슨 소용이 있겠는가?내가 보기에는 아마도 정말 쓸모가 없을 것 같아서 디자이너가 어떻게 생각하는지 모르겠다.
그러나 LSet의 또 다른 기능은 매우 강력하여 한 사용자 정의 형식 변수를 다른 사용자 정의 형식 변수로 복사할 수 있다.이것은 또 무슨 뜻입니까?
아니면 예를 들어서 IP 주소 아시죠?제가 여기서 핑바이두가 되돌아온 IP는 61.135.169.125입니다. 이런 형식의 IP 주소는 인류에게 보여주는 것일 뿐입니다. IP는 컴퓨터 내부에서 32비트 정수로 표시됩니다.어떻게 VB로 xxx를xxx.xxx.xxx 형식의 IP 주소가 32비트 정수로 바뀝니까?Google을 사용하면 다음과 같은 코드를 작성할 수 있습니다.

Sub Main()
    Debug.Print IPToLong("61.135.169.125")
End Sub

Private Function IPToLong(IPStr As String) As Long
   Dim Str() As String, HEXStr As String, TempStr As String
   Dim x As Long
  
   Str = Split(IPStr, ".")
   HEXStr = ""
   For x = 0 To UBound(Str)
      TempStr = Hex(Str(x))
      HEXStr = HEXStr & String(2 - Len(TempStr), "0") & TempStr
   Next x
   IPToLong = CLng("&H" & HEXStr)
End Function

코드가 정상적으로 작동할 수 있다는 것은 문제없지만, 우리는 LSet 문장으로 더욱 고급스러운 코드를 쓸 수 있다.

Private Type myBytes
    B1 As Byte
    B2 As Byte
    B3 As Byte
    B4 As Byte
End Type

Private Type myLong
    Val As Long
End Type

'By Demon
'http://jb51.net

Public Function IP2Long(ip As String) As Long
    Dim a() As String
    Dim b As myBytes
    Dim l As myLong
   
    a = Split(ip, ".")
    ' Little-Endian
    b.B1 = CByte(a(3))
    b.B2 = CByte(a(2))
    b.B3 = CByte(a(1))
    b.B4 = CByte(a(0))
    LSet l = b
    IP2Long = l.Val
End Function

LSet으로 myBytes 형식의 변수를 myLong 형식의 변수로 복사하면 매우 강력합니다.생성된 어셈블리 코드를 보려면 다음과 같이 하십시오.

00401A0E   lea     eax, dword ptr [ebp-0x20]   ; b
00401A11   push    eax
00401A12   lea     eax, dword ptr [ebp-0x14]   ; l
00401A15   push    eax
00401A16   push    0x4
00401A18   call    __vbaCopyBytes              ;  jmp to MSVBVM60.__vbaCopyBytes
호출된 것은 MSVBVM60입니다.DLL의 __vbaCopyBytes, 첫 번째 매개 변수는 복제가 필요한 바이트, 두 번째 매개 변수는 목표 주소, 세 번째 매개 변수는 원본 주소로 C 표준 라이브러리의memcpy 함수와 유사하지만 매개 변수의 순서가 다르기 때문에 그 내부의 실현은 어셈블리의 직렬 전송 명령일 뿐이다.

72A1A0F3 >  mov     ecx, dword ptr [esp+0x4]
72A1A0F7    push    esi
72A1A0F8    mov     esi, dword ptr [esp+0x10]
72A1A0FC    push    edi
72A1A0FD    mov     edi, dword ptr [esp+0x10]
72A1A101    mov     eax, ecx
72A1A103    mov     edx, edi
72A1A105    shr     ecx, 0x2
72A1A108    rep     movs dword ptr es:[edi], dword ptr [esi]
72A1A10A    mov     ecx, eax
72A1A10C    mov     eax, edx
72A1A10E    and     ecx, 0x3
72A1A111    rep     movs byte ptr es:[edi], byte ptr [esi]
72A1A113    pop     edi
72A1A114    pop     esi
72A1A115    retn    0xC
주의해야 할 것은 문서에서 우리에게 경고하는 것이다.

Warning   Using LSet to copy a variable of one user-defined type into a variable of a different user-defined type is not recommended. Copying data of one data type into space reserved for a different data type can cause unpredictable results.

When you copy a variable from one user-defined type to another, the binary data from one variable is copied into the memory space of the other, without regard for the data types specified for the elements.

사용자 정의 유형 변수를 LSet으로 복제하는 것은 권장되지 않습니다. 이것은 예상치 못한 결과를 초래할 수 있습니다. (예를 들어 구조가 일치하지 않음) 그러므로 자신이 무엇을 하는지 알지 않으면 LSet 문장을 사용하지 마십시오.

좋은 웹페이지 즐겨찾기