« Морская змея», — воскликнул кто-то.
Я увидел длинную черную морскую змею, плывущую глубоко под водой, и почти все были в оцепенении. Но морская змея сказала что-то, что нас напугало: «Я — знаменитая струна ВБ. Если вы продолжите нырять, вам придется попытаться обойти меня».
Я это наблюдаю по привычке, потому что знаю: чтобы победить противника, надо глубоко понять противника.
Поэтому я написал небольшой КОД, чтобы понять это.
Этот код работает очень хорошо, именно так, как я себе представлял, и отображает 12, 24,
Хорошо, поэтому я собираюсь использовать TextOut, чтобы распечатать его в окне. А почему я должен использовать эту функцию, а не другие, вас волнует? Поэтому я написал следующий код
Я нашел что-то не так? Кажется, длина строки неправильная. Тогда я подумаю об этом. В VB строка имеет тип BSTR, поэтому в качестве длины следует использовать L2. Вы узнаете, попробовав.
Боже мой, Книга Небес появляется после струны. Это Бог намекает мне, когда подарить мне прекрасную женщину?
Но я думаю, что Бог не ответит мне так скоро, значит, с моим кодом что-то не так.
Пока я медитировал, все наблюдали за мной. Ни за что, он такой красивый.
Поэтому я быстро написал следующий код
Когда я быстро нажал F5, в небе раздалось эхо, и предложение «Подари красоту» получило правильный ответ.
В это время я смотрел на эту морскую змею и уверенно плыл к ней, но она загадочно улыбалась.
Вы когда-нибудь видели улыбку змеи? Она медленно плыла.
«Тебе было бы слишком легко пройти мимо меня вот так». Почему это предложение такое знакомое? Кто-то из Золотого Зодиака сказал это?
«Дайте вам небольшой тест: знаете ли вы разницу между vbNullString и «» ?»
«Не думайте, что вы великий человек, потому что вы морская змея. Ваш вопрос слишком прост». Молодой человек рядом со мной, не уродливый и по прозвищу « Седьмой красивый мужчина в мире », сказал: « Думаешь, я не читал « Путеводитель по морской жизни » Да (Обозреватель объектов)?
ConstvbNullString=""
Члены VBA.Constants
Константа, используемая при вызове внешней процедуры, требующей строки ненулевого значения.
«Тогда ты имеешь в виду, что они одинаковые, но как насчет vbNullChar?» Морская змея посмотрела на седьмого красавца в мире со злыми намерениями.
"Конечно, то же самое. Ты читал инструкцию ВБ?" - выпалил седьмой красавец в мире, но почувствовал, что что-то не так. Но браузер объектов VB говорит
Члены VBA.Constants
Итак, что представляет собой следующий код?
Морской Змей раскрывает свой код
После того, как седьмой красавец в мире нажал F5, он был удивлён результатами кода Sea Snake.
018992841434596
020
Значит, кто-то ошибся между инструкциями В.Б. и Морской Змеей. Причём для S1 оба значения равны нулю, указатель указывает на ноль, а длина равна нулю. Это не нулевое значение в обычном смысле.
Затем седьмой красивый мужчина в мире повернул голову и посмотрел на меня.
«Мальчик, покрасуйся. Давай, сначала позволь мне тебе кое-что показать».
«Если вы хотите победить морскую змею, вы должны понять ее строение».
Строка VB является стандартной строкой BSTR. Например, структура строки «Hello» следующая.
->-width="26">0
->-width="37">0
->-width="40">'H
->-width="35">0
->-width="48">'e'
->-width="44">0
->-width="42">'l'
->-width="40">0
->-width="40">'l'
->-width="39">0
->-width="38">'о'
->-width="35">0
->-width="35">0
->-width="38">0->
Вы можете видеть, что первые четыре байта представляют собой количество байтов, занимаемых фактической длиной строки, которая является значением Long.
А последние два байта — это конечные символы, представляющие нулевое значение.
Десять байтов посередине — это именно содержимое строки.
Если мы используем s1="Hello", то куда указывает s1.
«Изначально я думал, что s1 указывает на первый байт, но когда я использовал свой самописный инструмент наблюдения за памятью VB, чтобы посмотреть значение байта, следующего за strptr(s1) , я обнаружил, что s1 указывает на пятый байт, который и есть струна действительно начинается».
«Все знают строение морской змеи, так почему же три ситуации, которые она только что предложила, различны?» — спросил я дайвера, который все еще был в оцепенении.
«Да, почему?»
Хорошо, достаньте OleView и откройте VB6.DLL в File->ViewTypeLib. Вы увидели чудесный мир. Не ошеломляйтесь и найдите следующие части.
Откройте их, и вы увидите настоящие определения внутри VB.
Вы видели, что vbNullString указывает на пустую строку, но эта пустая строка имеет нулевой адрес . А vbNullChar — это нулевой символ (эквивалент последнего символа строки в C). Итак, давайте посмотрим, что происходит, когда выполняется код Sea Snake.
Когда VB увидел это предложение, он явно изменил значение S1 на ноль.
Когда VB увидел это предложение, он предпринял несколько действий: он использовал SysAllocStringLen для размещения строки BSTR в куче, а затем скопировал в эту строку '/0'.
VB проделал здесь большую работу. Прежде всего, VB рассматривает "" как константу при компиляции, и для этой пустой строки ему необходимо выделить внутреннюю переменную. При загрузке EXE-файла ему также необходимо установить адрес, хотя это ничего не значит.
это строка типа 000000000000, для которой требуется 6 байтов (четыре байта заголовка и 2 байта хвоста)
Затем, когда вы увидите это предложение, передайте значение адреса пятого байта в s3.
Таким образом, хотя вы только что написали «» от руки, VB проделал гораздо больше работы. Хотя 6 байт — это немного, но в большом проекте, где все везде пишут «», это тоже немалые затраты. Поэтому в следующий раз вы не должны использовать "" , но обязательно используйте vbNullString.
- Ты это сказал, морская змея, - я презрительно посмотрел на нее.
Видя внезапное осознание всех, морская змея снова засмеялась (могут ли морские змеи смеяться?)
«Понять меня не означает по-настоящему контролировать меня. Многие дайверы класса C пренебрегают VB. Знаете, почему?»
«Медленно, VB работает со струнами слишком медленно». Многие дайверы поспешили ответить на этот вопрос.
«Ха-ха, да», — громко рассмеялась морская змея и медленно поплыла к глубокому морю. — « Я вернусь! »
У нас осталась группа дайверов, и все думают, действительно ли мы понимаем морскую змею, ведь морская змея в VB Ocean Legend довольно страшная, так ли легко она уйдет, и что означает IwillBack? ?
Но мы продолжим погружение….
«Смотри, коралловый риф!» — воскликнул кто-то! ->