VB6에는 Let, Set, LSet, RSet 등 유사해 보이는 여러 명령문이 있습니다.
Let은 일반 변수 할당에 사용됩니다.
다음과 같이 코드 코드를 복사합니다.
[Let] varname = 표현식
대부분의 경우 Let을 생략하고 등호로 직접 값을 지정하기 때문에 Let의 존재조차 모르는 사람이 많습니다.
Set은 객체 할당에 사용되며, 변수를 객체에 지정하고 객체의 참조 카운트를 증가시킵니다. 많은 사람들이 참조 카운팅이 무엇인지 모릅니다.
그렇다면 LSet은 어떤 용도로 사용되나요? 얼핏 보면 Let과 Set의 조합처럼 보이지만 그렇지 않습니다. LSet의 L은 Left의 약어이고 이에 대응하는 것은 RLet입니다. L이 Left의 약어라는 것을 어떻게 알 수 있는지 물어보셨나요? 문서는 다음과 같이 말합니다.
다음과 같이 코드 코드를 복사합니다.
LSet 문
문자열 변수 내에서 문자열을 왼쪽으로 정렬하거나, 한 사용자 정의 유형의 변수를 다른 사용자 정의 유형의 다른 변수에 복사합니다.
RSet 문
문자열 변수 내에서 문자열을 오른쪽으로 정렬합니다.
LSet에는 RSet보다 함수가 하나 더 있습니다. 먼저 같은 부분을 살펴보겠습니다. 둘 다 문자열 변수에서 문자열을 왼쪽(오른쪽)으로 정렬하는 데 사용됩니다. 그것은 무엇을 의미합니까? 사실, 문서를 읽는 것만으로는 이해가 되지 않습니다. 실제로 테스트해 보겠습니다.
다음과 같이 코드 코드를 복사합니다.
서브메인()
희미한 URL을 문자열로
Dim은 문자열로
URL = "//www.VeVB.COm"으로 설정
s = 문자열$(20, "*")
LSet s = URL
디버그.인쇄
RSet s = URL
디버그.인쇄
서브 끝
출력(공백에 주의):
다음과 같이 코드 코드를 복사합니다.
//www.VeVB.COm
//www.VeVB.COm
실제로 왼쪽 정렬과 오른쪽 정렬이 있는데 별표 *는 공백으로 대체됩니다. 내 생각에는 디자이너가 무슨 생각을 했는지는 정말 쓸모가 없을 것 같다.
그러나 LSet의 또 다른 기능은 사용자 정의 유형 변수를 다른 사용자 정의 유형 변수에 복사할 수 있다는 점에서 매우 강력합니다. 이것은 무엇을 의미합니까?
예를 들어보겠습니다. IP 주소를 알고 계시나요? 여기에서 Baidu를 핑하여 반환된 IP는 61.135.169.125입니다. 이 형식의 IP 주소는 사람이 볼 수 있는 전용 주소입니다. IP는 실제로 컴퓨터 내부에서 32비트 정수로 표시됩니다. VB를 사용하여 xxx.xxx.xxx.xxx 형식의 IP 주소를 32비트 정수로 변환하는 방법은 무엇입니까? Google을 검색한 후 다음과 유사한 코드를 작성할 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
서브메인()
디버그.IPToLong 인쇄("61.135.169.125")
서브 끝
개인 함수 IPToLong(IPStr As String) 길이
Dim Str()을 문자열로, HEXStr을 문자열로, TempStr을 문자열로
희미한 x만큼 긴
Str = 분할(IPStr, ".")
HEXStr = ""
x = 0인 경우 UBound(Str)로
TempStr = Hex(Str(x))
HEXStr = HEXStr & String(2 - Len(TempStr), "0") & TempStr
다음 x
IPToLong = CLng("&H" & HEXStr)
기능 종료
코드는 잘 작동합니다. 괜찮습니다. 하지만 LSet 문을 사용하면 더 "고급" 코드를 작성할 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
개인 유형 myBytes
B1을 바이트로
B2를 바이트로
B3 바이트로
B4 바이트로
끝 유형
개인 유형 myLong
Val As Long
끝 유형
'악마에 의해
'http://VeVB.COm
공용 함수 IP2Long(ip As String)
Dim a()를 문자열로
희미한 b를 myBytes로
희미한 l As myLong
a = 분할(ip, ".")
'노트 리틀 엔디안
b.B1 = CByte(a(3))
b.B2 = CByte(a(2))
b.B3 = CByte(a(1))
b.B4 = CByte(a(0))
L세트 l = b
IP2Long = l.Val
종료 기능
LSet을 사용하여 myBytes 유형의 변수를 myLong 유형의 변수로 복사하는 것은 매우 훌륭하고 강력합니다. 생성된 어셈블리 코드를 살펴보세요.
다음과 같이 코드 코드를 복사합니다.
00401A0E lea eax, dword ptr [ebp-0x20] 변수 b의 주소
00401A11 푸시 eax
00401A12 lea eax, dword ptr [ebp-0x14] 변수 l의 주소
00401A15 푸시 eax
00401A16 푸시 0x4
00401A18 __vbaCopyBytes를 MSVBVM60.__vbaCopyBytes로 호출합니다.
MSVBVM60.DLL에서 __vbaCopyBytes라고 불리는 것은 첫 번째 매개변수는 복사할 바이트, 두 번째 매개변수는 대상 주소, 세 번째 매개변수는 소스 주소이며, C 표준 라이브러리의 memcpy 함수와 유사합니다. 매개 변수의 순서가 다르며 내부 구현은 어셈블리의 문자열 전송 명령에 지나지 않습니다.
다음과 같이 코드 코드를 복사합니다.
72A1A0F3 > mov ecx, dword ptr [esp+0x4]
72A1A0F7 푸시 esi
72A1A0F8 mov esi, dword ptr [esp+0x10]
72A1A0FC 푸시 에디
72A1A0FD mov edi, dword ptr [esp+0x10]
72A1A101 mov eax,ecx
72A1A103 mov edx, edi
72A1A105 슈렉x, 0x2
72A1A108 담당자 movs dword ptr es:[edi], dword ptr [esi]
72A1A10A mov ecx, eax
72A1A10C mov eax, edx
72A1A10E 및 ecx, 0x3
72A1A111 담당자 movs 바이트 ptr es:[edi], 바이트 ptr [esi]
72A1A113 포페디
72A1A114 팝 esi
72A1A115 0xC 반환
문서에서는 다음과 같이 경고합니다.
다음과 같이 코드 코드를 복사합니다.
경고 LSet를 사용하여 한 사용자 정의 유형의 변수를 다른 사용자 정의 유형의 변수에 복사하는 것은 다른 데이터 유형용으로 예약된 공간에 복사하는 것은 권장되지 않습니다.
하나의 사용자 정의 유형에서 다른 유형으로 변수를 복사하면 요소에 지정된 데이터 유형에 관계없이 한 변수의 이진 데이터가 다른 변수의 메모리 공간으로 복사됩니다.
LSet를 사용하여 사용자 정의 유형 변수를 복사하는 것은 권장되지 않으며 예기치 않은 결과(예: 정렬되지 않은 구조)가 발생할 수 있으므로 수행 중인 작업을 알지 못하는 경우 LSet 문을 사용하지 마십시오.