누군가가 " 바다뱀"이라고 외쳤다.
바다 깊은 곳에서 헤엄치는 길고 검은 바다뱀을 보았는데, 거의 모든 사람들이 멍해졌습니다. 그런데 바다뱀은 "내가 유명한 VB 현이다. 계속 다이빙을 하면 나를 지나쳐야 한다"고 우리를 겁나게 하는 말을 했다.
상대를 이기기 위해서는 상대를 깊이 이해해야 한다는 것을 알기 때문에 습관적으로 관찰하고 있습니다.
그래서 그것을 이해하기 위해 작은 CODE를 작성했습니다.
이 코드는 제가 상상한 대로 매우 잘 실행되며 12, 24,
좋습니다. TextOut을 사용하여 창에 인쇄하겠습니다. 다른 기능을 사용하지 않고 이 기능을 사용해야 하는 이유에 대해 알려주세요. 그래서 다음 코드를 작성했습니다.
제가 뭔가 잘못된 걸 발견했나요? 문자열의 길이가 잘못된 것 같습니다.그러고 보니 VB에서는 문자열이 BSTR형이므로 L2를 길이로 사용해 보아야 알겠죠?
맙소사, 문자열 뒤에 천국의 책이 나타납니다. 하나님께서 나에게 언제 아름다운 여인을 주실 것인지를 암시하시는 것입니까?
그런데 하나님이 그렇게 빨리 응답하지 않으실 것 같아서 제 코드에 뭔가 문제가 있는 게 틀림없어요.
내가 명상하는 동안 모두가 나를 지켜보고 있었습니다. 안돼, 그 사람 너무 잘생겼어
그래서 신속하게 다음 코드를 작성했습니다.
재빠르게 F5를 눌렀더니 하늘에 메아리가 울리고 "Givemea beauty"라는 문장이 정답을 얻었습니다.
이때 나는 이 바다뱀을 바라보며 자신감 있게 헤엄쳐 갔지만 바다뱀은 신비롭게 미소를 지었다.
천천히 헤엄쳐가는 뱀의 미소를 본 적이 있나요?
"이대로 지나가면 너무 쉬울 것 같아요." 이 문장이 왜 이렇게 익숙한 걸까요? 황금 조디악의 누군가가 이런 말을 했나요?
"약간의 테스트를 해보세요. vbNullString 과 "" 의 차이점을 아시나요?"
"바다뱀이라고 대단한 사람이라고 생각하지 마세요. 질문이 너무 간단해요." 내 옆에 있는 ' 세계 7대 미남 '이라는 별명을 가진 청년이 말했다. 내가 해양 생물 가이드를 읽지 않은 것 같나요? " 네 (객체 브라우저)
ConstvbNullString=""
VBA.Constants의 회원
0이 아닌 값 문자열이 필요한 외부 프로시저를 호출할 때 사용되는 상수
"그렇다면 똑같다는 뜻인데 vbNullChar는 어떻습니까?" 바다뱀은 사악한 의도로 세상에서 일곱 번째로 잘생긴 남자를 바라보았습니다.
"물론 그렇죠. VB 지시 사항을 읽어보셨나요?" 세계 7대 미남이 무심코 말했지만 뭔가 이상하다는 걸 느꼈다. 하지만 VB의 개체 브라우저는 다음과 같이 말합니다.
VBA.Constants의 회원
그러면 다음 코드는 무엇을 나타냅니까?
Sea Serpent가 코드를 제공합니다.
세계 7번째 미남이 F5를 누른 뒤 바다뱀 코드 결과에 깜짝 놀랐다.
018992841434596
020
따라서 이는 VB의 지침과 Sea Snake 사이에 누군가 잘못되었음을 의미합니다. 게다가 S1의 경우 두 값이 모두 0이고 포인터가 0을 가리키며 길이도 일반적인 의미에서 0이 아닙니다.
그러자 세계 7대 미남이 고개를 돌려 나를 바라보았다.
"얘야, 자랑해. 자, 먼저 뭔가 보여주지."
"바다뱀을 물리치고 싶다면 바다뱀의 구조를 이해해야 한다."
VB의 문자열은 표준 BSTR 문자열입니다. 예를 들어 "Hello" 문자열의 구조는 다음과 같습니다.
->-너비="26">0
->-너비="37">0
->-width="40">'H
->-너비="35">0
->-width="48">'e'
->-너비="44">0
->-width="42">'l'
->-너비="40">0
->-width="40">'l'
->-너비="39">0
->-width="38">'o'
->-너비="35">0
->-너비="35">0
->-너비="38">0->
처음 4바이트는 문자열의 실제 길이(Long 값)가 차지하는 바이트 수를 나타냅니다.
그리고 마지막 2바이트는 0 값을 나타내는 후행 문자입니다.
가운데 10바이트가 바로 문자열의 내용입니다.
s1="Hello"를 사용하면 s1은 어디를 가리킵니까?
"처음에는 s1이 첫 번째 바이트를 가리킨다고 생각했지만, 제가 직접 작성한 VB 메모리 관찰 도구를 사용하여 strptr(s1 ) 다음의 바이트 값을 살펴보니 s1이 다섯 번째 바이트를 가리킨다는 것을 알았습니다. 문자열이 실제로 시작됩니다.”
"바다뱀의 구조는 다들 알고 있는데 왜 방금 제안한 세 가지 상황이 다른 걸까요?" 나는 여전히 멍하니 있는 다이버에게 물었다.
"그래, 왜?"
좋습니다. OleView를 꺼내서 File->ViewTypeLib에서 VB6.DLL을 엽니다. 멋진 세상을 보셨나요? 당황하지 말고 다음 부분을 찾아보세요.
이를 열면 VB 내부의 실제 정의를 볼 수 있습니다.
vbNullString이 빈 문자열을 가리키지만 이 빈 문자열의 주소는 0인 것을 보셨나요? 그리고 vbNullChar는 0 문자입니다(C 문자열의 마지막 문자와 동일). 그럼 Sea Snake 코드가 실행될 때 무슨 일이 일어나는지 살펴보겠습니다.
VB는 이 문장을 보고 S1의 값을 0으로 분명히 변경했습니다.
VB는 이 문장을 보고 몇 가지 작업을 수행하여 SysAllocStringLen을 사용하여 힙에 BSTR 문자열을 할당한 다음 '/0'을 이 문자열에 복사했습니다.
VB는 여기서 많은 작업을 수행했습니다. 우선 VB는 컴파일할 때 ""를 상수로 처리하므로 이 빈 문자열에 대해 내부적으로 변수를 할당해야 합니다. EXE 파일을 로드할 때 주소도 설정해야 하지만 아무 의미는 없습니다.
000000000000과 같은 문자열이며 6바이트(4개의 헤더 바이트와 2개의 테일 바이트)가 필요합니다.
그러면 이 문장이 보이면 다섯 번째 바이트의 주소 값을 s3에 전달하세요.
따라서 ""를 직접 작성했지만 VB에서는 더 많은 작업을 수행하게 되었습니다. 6바이트는 많은 양은 아니지만, 모두가 여기저기에 ""를 쓰는 대규모 프로젝트에서는 상당한 비용이기도 합니다. 따라서 다음번에는 ""를 사용하면 안 되지만 vbNullString을 사용해야 합니다.
"그렇게 말했구나, 바다뱀아" 나는 그것을 경멸적으로 바라봤다.
모두의 갑작스러운 깨달음에 바다뱀은 또 웃었다. (바다뱀도 웃을 수 있을까?)
"나를 이해한다는 것이 나를 진정으로 통제한다는 것을 의미하지는 않습니다. 많은 C 다이버들이 VB를 경멸할 것입니다. 왜 그런지 아십니까?"
"느려요, VB의 스트링 작업이 너무 느립니다." 많은 다이버들이 이 질문에 서둘러 대답했습니다.
"하하, 응" 바다뱀은 크게 웃으며 천천히 깊은 바다를 향해 헤엄쳐 갔다. " IwillBack! "
우리는 다이버 그룹과 함께 남았고 모두가 생각하고 있습니다. VB Ocean Legend의 바다뱀은 매우 무섭기 때문에 바다뱀을 정말로 이해하고 있습니까? 그렇게 쉽게 도망갈 것인가? IwillBack은 무엇을 의미합니까? ?
하지만 우리는 계속해서 다이빙을 할 것입니다…
"보라, 산호초야!" 누군가가 소리쳤다! ->