VB读取内存字符串的问题

liuyh7788 2015-03-18 07:36:02
如下:
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
长度不一样,糊涂了,请尊敬的老师给我洗洗脑啊。。。谢谢啦!
...全文
288 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2015-03-19
  • 打赏
  • 举报
回复
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。
舉杯邀明月 2015-03-19
  • 打赏
  • 举报
回复
引用 楼主 liuyh7788 的回复:
如下: 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读到的内容来定)。
liuyh7788 2015-03-19
  • 打赏
  • 举报
回复
明白了,谢谢楼上的老师! 结贴
一如既往哈 2015-03-18
  • 打赏
  • 举报
回复
里面可能有chr(0)等不能在文本框中显示的东东...... 读到变量rStr中后再处理一下即可: rStr = Trim(StrReadMem(iMingCheng)) '读内存文本到字符串变量 if instr(rstr,chr(0))>0 then rstr=left(rstr,instr(rstr,chr(0))-1) endif

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧