VB读取内存字符串的有关问题

VB读取内存字符串的问题
如下:
Option Explicit
Dim rStr As String

Private Function StrReadMem(ByVal DiZhi As Long) As String  '读内存文本数据
 Dim FenStr(14) As Byte

On Error GoTo mErr

' 在内存地址中读取文本数据
ReadProcessMemory pHandle, DiZhi, FenStr(0), 13, 0&
StrReadMem = StrConv(FenStr, vbUnicode)

mErr:

End Function

Private Function ReadText(ByVal ID As Long)  '读内存文本
Dim G As Long

If ID > 0 Then
  Text1.Text = Trim(StrReadMem(iMingCheng))   '读内存文本到Text控件  iMingCheng是内存地址 DiZhi
  rStr = Trim(StrReadMem(iMingCheng))  '读内存文本到字符串变量
End If
 
  
End Function

Text控件能正确显示读取的文本字符;比如Text1.text="小王"
但是rStr变量里不光有"小王"这两个字还有其它的未知东西
按理说 Text控件里的内容和rStr里的内容应该是一样的啊?
用Len测:
Len(Text1.text)=2
Len(rStr)=15
长度不一样,糊涂了,请尊敬的老师给我洗洗脑啊。。。谢谢啦!

------解决思路----------------------
里面可能有chr(0)等不能在文本框中显示的东东......
读到变量rStr中后再处理一下即可:
rStr = Trim(StrReadMem(iMingCheng))  '读内存文本到字符串变量
if instr(rstr,chr(0))>0 then 
rstr=left(rstr,instr(rstr,chr(0))-1)
endif
------解决思路----------------------
引用:
如下:
Option Explicit
Dim rStr As String

Private Function StrReadMem(ByVal DiZhi As Long) As String  '读内存文本数据
 Dim FenStr(14) As Byte

...........
用Len测:
Len(Text1.text)=2
Len(rStr)=15
长度不一样,糊涂了,请尊敬的老师给我洗洗脑啊。。。谢谢啦!

VB6的字符串为BSTR结构,字符串长度是由字符数据首址之前4字节存储的数据值记录,
字符串数据可以包含任意值,即使NULL字符(就是“空字符”,编码值为0,VB6中有常量vbNullChar表示)也是有效字符,
整个字符串中可以包含多个NULL。
而API中、各种标准控件及第三方控件(用VB6做的自定义控件除外),处理字符串时常以NULL为结束标志,
不管VB6代码中传递的字符串数据有多长,只要遇到NULL就表示字符串数据结束了。
按你Function StrReadMem( )中的定义Dim FenStr(14) As Byte ,FenStr总共为15(或14)字节,
执行:StrReadMem = StrConv(FenStr, vbUnicode)
函数StrReadMem的值最多为15字符!
你的代码:Text1.Text = Trim(StrReadMem(iMingCheng))
你说 Text1.text="小王",那Len(rStr) 最多为13(因为“小王”要占4字节,后面就算全NULL,也最多11字符),
怎么可能 Len(rStr)=15 !
只有ReadProcessMemory读取的字符数据全是西文字符,rStr的长度才能达到15!

至于你说 Len(Text1.text)跟Len(rStr) 的值不一样,这个其实很正常。
我先已经说过,控件一般是以NULL字符为字符串结束标志,
如果ReadProcessMemory( )后FenStr的前4字节中为“小王”2字的编码,第5字节为0,
那StrReadMem = StrConv(FenStr, vbUnicode)后,rStr中包含FenStr中全部15字节的内容,
 因此rStr的字符串中除了“小王”,还有“别的东西”在内!
而同样的字符串数据赋值给TextBox,“小王”后面有个NULL,则TextBox的值就从NULL处截断(不含NULL),只剩“小王”了。
因此 Len(Text1.text)=2 ,而 Len(rStr) 的值就大得多了(具体是多少,要以ReadProcessMemory读到的内容来定)。

------解决思路----------------------
VB内部的字符串是Unicode的BSTR,可以包括\0字符。
但是当时的操作系统Win9X还是ANNSI的,所以控件接口是用的ANSI接口的,存取Text1.Text属性时,字符串符会在\0处截断。
变量和文本框内容不一致很正常。
其实正确来说,StrReadMem 本身就应该截断字符串的。
Private Function StrReadMem(ByVal DiZhi As Long) As String
    Dim FenStr(14)  As Byte
    Dim i           As Long

    On Error GoTo mErr

    ReadProcessMemory pHandle, DiZhi, FenStr(0), 13, 0&
    
    i = InStrB(1, FenStr, vbNullChar)
    If i > 1 Then
        StrReadMem = StrConv(LeftB(FenStr, i - 1), vbUnicode)
    End If

mErr:

End Function


又:同#2,内容是小王,那么Len(rStr) 应该是 13。