VB6의 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 문장을 사용하지 마십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
SendKeys.Send()에서 확인란을 확인하는 Wazap그대로 타이틀대로 SendKeys.Send() 메소드를 사용해 체크 박스를 체크하는 방법이 됩니다. 업무에서 사용하고 있는 Windows Form의 어플리케이션의 조작을 자동화하고 싶다고 하는 이야기가 있어, 여러 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.