「ウミヘビ」と誰かが叫んだ。
海底深くで長く黒いウミヘビが泳いでいるのが見え、ほぼ全員が呆然としていました。しかしウミヘビは「私は有名なVBストリングだ。このまま潜り続けるなら私を追い越さなければいけない」と私たちを怖がらせるようなことを言いました。
私がそれを習慣的に観察しているのは、相手を倒すには、相手を深く理解する必要があることを知っているからです。
そこで、それを理解するために小さなコードを書きました。
このコードは想像どおりに非常にうまく実行され、12、24、
わかりました。では、TextOut を使用してウィンドウに出力することにします。なぜ他の関数ではなくこの関数を使用する必要があるかについては、気にしませんか?そこで次のコードを書きました
何か間違ったことを見つけましたか?文字列の長さが間違っているようですが、VB では文字列は BSTR 型なので、長さは L2 を使用する必要があります。
なんと、天の書が文字列の後に現れます。いつ私に美しい女性を与えるかを神が示唆しているのでしょうか?
しかし、神はすぐには答えてくれないと思うので、私のコードに何か問題があるに違いありません。
私が瞑想している間、みんなが私を見ていました。まさか、彼はとてもハンサムです。
そこで、すぐに次のコードを書きました
すぐに F5 を押すと、空に反響があり、「Givemea beautiful」という文が正しく反応しました。
この時、私はこのウミヘビを見て、自信を持って向かって泳ぎましたが、ウミヘビは不思議な笑みを浮かべました。
ヘビがゆっくりと泳いでくるのを見たことがありますか。
「このまま私を通り過ぎてしまうのは簡単すぎるでしょう。」なぜこの文がそんなに馴染み深いのでしょうか?ゴールデン十二支の誰かがこれを言いましたか?
「ちょっとテストしてみませんか。vbNullStringと ""の違いを知っていますか?」
「ウミヘビだからって自分が偉い人だと思うなよ。あなたの質問は単純すぎるよ。」 私の隣にいた、ブサイクではない、「世界で7番目のイケメン」と呼ばれる若者が言いました。私が『海洋生物ガイド』を読んでいないと思っているのですか? 」 (オブジェクト ブラウザー)
ConstvbNullString=""
VBA.Constants のメンバー
ゼロ以外の値の文字列を必要とする外部プロシージャを呼び出すときに使用される定数
「では、同じということですが、vbNullCharはどうでしょうか?」 ウミヘビは世界で7番目の美男を悪意を持って見つめた。
「もちろん同じよ。VBの説明書読んだ?」 世界で7人目のイケメンは口走ったが、何かが違うと感じた。しかし、VBのオブジェクトブラウザはこう言います。
VBA.Constants のメンバー
それでは、次のコードは何を表しているのでしょうか?
シーサーペントがコードを与える
世界で 7 人目のハンサムな男性が F5 キーを押した後、シースネーク コードの結果に驚きました。
018992841434596
020
つまり、VB の指示と Sea Snake の間で誰かが間違っているに違いありません。また、S1 については、両方の値がゼロであり、ポインタはゼロを指しており、長さは通常の意味でのゼロ値ではありません。
すると世界で7番目のハンサムな男が振り向いて私を見た。
「坊や、見せびらかしてみろ。さあ、まず何か見せてやろう。」
「ウミヘビを倒したいなら、ウミヘビの構造を理解する必要がある。」
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">'o'
->-width="35">0
->-width="35">0
->-width="38">0->
最初の 4 バイトは、文字列の実際の長さ (Long 値) が占めるバイト数を表していることがわかります。
最後の 2 バイトは、ゼロ値を表す末尾の文字です。
中央の 10 バイトは文字列の内容そのものです。
s1="Hello" を使用した場合、s1 はどこを指しますか。
「最初は s1 が最初のバイトを指していると思っていましたが、自作の VB メモリ観察ツールを使用して strptr(s1) に続くバイト値を調べたところ、 s1 が 5 番目のバイトを指していることがわかりました。本当に弦が始まります。」
「ウミヘビの構造は誰もが知っていますが、なぜ今提案された 3 つの状況が異なるのでしょうか?」私はまだ呆然としているダイバーに尋ねました。
「ええ、なぜですか?」
さて、OleView を取り出し、File->ViewTypeLib で VB6.DLL を開きます。呆然とせずに次の部分を見つけてください。
これらを開くと、VB 内の実際の定義が表示されます。
vbNullString は空の文字列を指していますが、この空の文字列にはアドレスがゼロであることがわかりましたか。また、vbNullChar はゼロ文字 (C の文字列の最後の文字に相当) です。それでは、Sea Snake コードの実行中に何が起こるかを見てみましょう。
VB がこの文を見たとき、明らかに S1 の値がゼロに変更されました。
VB はこの文を認識すると、SysAllocStringLen を使用して BSTR 文字列をヒープに割り当て、この文字列に '/0' をコピーします。
VB はここで多くの作業を行いました。まず、VB はコンパイル時に "" を定数として扱い、この空の文字列に内部で変数を割り当てる必要があります。 EXE ファイルをロードするときは、特に意味はありませんが、アドレスも設定する必要があります。
000000000000 のような文字列で、6 バイト (ヘッダー 4 バイトと末尾 2 バイト) が必要です。
次に、この文が表示されたら、5 バイト目のアドレス値を s3 に渡します。
したがって、「」を手で書いただけなのに、VB はさらに多くの作業を行うことになります。 6バイトは大した量ではありませんが、全員があちこちに「」を書き込む大規模なプロジェクトでは、これもかなりの費用になります。したがって、次回からは "" を使用しないでください。ただし、必ず vbNullString を使用してください。
「そう言ったね、ウミヘビ」と軽蔑した目で見ました。
皆のハッとした気づきを見て、ウミヘビはまた笑いました(ウミヘビは笑えますか?)
「私を理解するということは、私を真にコントロールするという意味ではありません。多くの C ダイバーは VB を軽蔑します。その理由がわかりますか?」
「遅い、VB の文字列操作は遅すぎる。」多くのダイバーがこの質問に答えようとしました。
「ははは、はい」ウミヘビは高らかに笑い、ゆっくりと深海に向かって泳ぎました。「 IwillBack! 」
私たちにはダイバーのグループが残されており、誰もが考えています。VB Ocean Legend のウミヘビは非常に怖いので、ウミヘビは本当に理解できるのでしょうか。そんなに簡単に逃げてしまうのでしょうか。また、IwillBack とは何を意味しますか? ?
しかし、私たちは潜り続けます…。
「ほら、サンゴ礁だ」と誰かが叫びました。 ->