2017-11-26 13 views
2

VB6 では、変数のアドレス(この場合はスタックに割り当てられた変数strのアドレス)を返し、メモリ内の文字列へのポインタを保持する必要があります。 StrPtr(またはStrPtr)は、割り当てられた文字列のアドレスをメモリに戻す必要があります。 ByValだけのコピーを作成する必要がありますが、この場合には、それが妙に動作します:なぜVarPtr(ByVal str)の結果がStrPtr(str)と同じですか? (VB6)

Dim str As String 
str = "asd" 
Debug.Print VarPtr(str) 
Debug.Print VarPtr(ByVal str) 
Debug.Print StrPtr(str) 

結果は次のとおりです。

1636452 
110882980 
110882980 

なぜVarPtr(ByVal str)の結果はStrPtr(str)と同じですか?

答えて

4

文字列を渡したByValは、BStr内のC文字列を含む文字の最初の文字のアドレスを渡します。 StrPtrも同じです。

これには2つの理由があります。 UnicodeをAPI呼び出しと文字列生成に渡します。 APIにUnicodeを渡す

は、API関数のUnicode文字列を送信するときは、文字列ではなくバイト配列にStrPtrを使用することができ

を呼び出します。

Dim ByteArr() as Byte 
Var1="My Text" 
ByteArr = Var1 
APICall(ByteArr(0)) 
APICall(StrPtr(Var1)) 

両方とも、Unicode文字列をAPI関数に渡す必要があります。 Windows 95がUnicodeを実行しなかったので、declareステートメントを使用すると、Unicode文字列がANSI文字列に変換されます。

一方のStringビル

あなたは、文字列の建物であれば、そのはLeftRight、およびMid、ない機能を使用してVBAに組み込まれ(彼らはオーバーロードされます) 。

Sub Main() 
    Dim Var As String 
    Var = "gggggggggggg" 
    MsgBox StrPtr(Var) 
    Mid(Var, 1, 2) = "xx" 
    MsgBox StrPtr(Var) & " - " & Var 
End Sub 

ByValの対のByRef

一部の著者は、に適用されたときよりも、 文字列に適用されたとき、それは別の意味を持つことを意味し、ByValキーワードを 文字列のために過負荷になっていることを言いたいですその他の変数。率直に言って、私はそれを見ない。 ライティング:

ByVal str As String 

文字列へのポインタであるBSTR(実際ABSTR)の内容を渡すVBを伝えます。したがって、ByValは通常 を処理しています.BSTRの内容が別のオブジェクト へのポインタであるため、これは参照渡しをシミュレートします。同様に:

ByRef str As String 

は、期待通りにBSTRのアドレスを渡します。

Visual BasicのとのWin32 APIプログラミング、6弦が、Visual Basicでオライリー、MSDNライブラリから2001年10月

StrPtrを

文字列がある章BSTRとして保存されます。 のVarPtrをString型の変数に使用すると、BSTRのアドレスが取得されます。 は、その文字列のポインタへのポインタです。 文字列バッファー自体のアドレスを取得するには、StrPtr関数を使用する必要があります。この 関数は、文字列の最初の文字のアドレスを返します。 文字列はVisual BasicでUNICODEとして格納されることを考慮してください。

文字列の最初の文字のアドレスを取得するには、文字列 をStrPtr関数に渡します。

例:

Dim lngCharAddress as Long 
Dim strMyVariable as String 
strMyVariable = "Some String" 
lngCharAddress = StrPtr(strMyVariable) 

あなたはAPI呼び出しに UNIOCODE文字列へのポインタを渡す必要があるときは、この機能を使用することができます。

HOWTOは:Visual BasicのQ199824での変数のアドレスを取得 Microsoft Knowledge Baseの、MSDN 2001年10月

そのため、CorelのようなVBAを実装する企業(VBA/VB6言語の一部ではありません)は、VBAでそれを実装することはできません。 VB6の仕様はここにありますhttps://msdn.microsoft.com/en-us/library/dd361851.aspx

+0

VB6では 'Left'や' Right'文はなく、 'Mid' /' Mid $ 'のみを代入の対象とすることができます。 – wqw

関連する問題