● 文字列のポインタからVB用文字列に復元する ●

その場その場で書いても良いが、やはり作っておくと便利なのである。

Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long
Private Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
                                   (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)

'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
' 機  能:文字列を Chr$(0)[=vbNullChar] まで取得する
' 引  数:(in)SrcStr … 対象文字列
' 返り値:編集された文字列
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Private Function StrNullCut(ByVal SrcStr As String) As String
    Dim NullCharPos As Integer
    NullCharPos = InStr(SrcStr, Chr$(0))
    If NullCharPos = 0 Then
        StrNullCut = SrcStr
        Exit Function
    End If
    StrNullCut = Left$(SrcStr, NullCharPos - 1)
End Function

'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
' 機  能:文字列のポインタからVB用文字列に復元する(Unicode用)
' 引  数:(i)StringPtr … Unicode文字列のポインタ
' 返り値:カレントディレクトリ
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Public Function GetStringFromPtrW(ByVal StringPtr As Long) As String
    Dim StrLen As Long
    Dim StrBin() As Byte

    'lstrlenW(Unicode)のエントリを使用している場合は、lstrlenWの倍サイズ
    'API関数を使用したくない場合は、VB標準関数の Len でも良い
    StrLen = lstrlenW(StringPtr) * 2

    'バイト配列再確保
    ReDim StrBin(StrLen - 1) As Byte

    '文字列の先頭からStrLen分、バッファにコピー
    Call CopyMemory(StrBin(0), ByVal StringPtr, StrLen)

    'lstrlenW(Unicode)のエントリを使用している場合はStrConvは不要
    GetStringFromPtrW = StrNullCut(StrBin)
End Function

'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
' 機  能:文字列のポインタからVB用文字列に復元する(ANSI用)
' 引  数:(i)StringPtr … ANSI文字列のポインタ
' 返り値:カレントディレクトリ
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Public Function GetStringFromPtr(ByVal StringPtr As Long) As String
    Dim StrLen As Long
    Dim StrBin() As Byte

    '文字列のバイト数を取得する
    StrLen = lstrlen(StringPtr)

    'バイト配列再確保
    ReDim StrBin(StrLen - 1) As Byte

    '文字列の先頭からStrLen分、バッファにコピー
    Call CopyMemory(StrBin(0), ByVal StringPtr, StrLen)

    'StrConvでANSIからUnicodeに変換する
    GetStringFromPtr = StrNullCut(StrConv(StrBin, vbUnicode))
End Function


[テストロジック]
Private Sub Command1_Click()
    Dim Test As String
    Test = "あいうえおABC山谷 河12345"
    Debug.Print "[" & GetStringFromPtr(StrPtr(StrConv(Test, vbFromUnicode))) & "]"
    Debug.Print "[" & GetStringFromPtrW(StrPtr(Test)) & "]"
End Sub

戻る