游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3502|回复: 2

如何读取内存数据

[复制链接]

3

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
QQ
发表于 2005-4-19 21:11:00 | 显示全部楼层 |阅读模式
如何用VB读取内存数据,我要读出的数据是双字节的可以吗

7

主题

87

帖子

109

积分

注册会员

Rank: 2

积分
109
QQ
发表于 2005-6-3 01:40:00 | 显示全部楼层

Re:如何读取内存数据

  我有一个笨办法,可能速度不理想。在VB6的VBA库中有一个隐藏的模块“_HiddenModule”(需要显示隐藏成员才能在资源浏览器中看见),模块内又有三个隐藏的函数"ObjPtr"、"StrPtr"、"VarPtr",顾名思义是分别获得对象、字符串、变量的地址。三个函数都返回Long型值,就是我们需要的内存地址(相当于C语言中的指针)。利用这些函数返回的地址,再配合Windows API "CopyMemory",将值从获得的地址复制到另一个变量地址,就可以实现像C语言一样的使用指针了。

  以下是一个例子,将"SourceVariant"的值通过地址传给"DestinationVariant":

      '声明WindowsAPI:
      Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

      '定义源变量(为Byte类型)和存放源变量地址的变量(为Long类型,相当于指针):
  Dim SourceVariant as Byte, SourceVariantAddress as Long

      '定义目标变量(为Byte类型)和存放目标变量地址的变量(为Long类型,相当于指针):
      Dim DestinationVariant as Byte, DestinationVariantAddress as Long

      '分别获取源变量和目标变量的内存地址(使用VarPtr函数):
      SourceVariantAddress=VBA._HiddenModule.VarPtr(SourceVariant)
      DestinationVariantAddress=VBA._HiddenModule.VarPtr(DestinationVariant)

  '对源变量任意赋值(本例使SourceVariant的值为100):
  SourceVariant=100

      '通过地址将源变量的值复制到目标变量(使用CopyMemory函数):
  CopyMemory  DestinationVariantAddress, SourceVariantAddress, 1 '读取一个字节。

      '此时DestinationVariant的值已变为100。
  Print DestinationVariant  '则打印"100"。

  若是读取的变量长度大于字节,则需要改变变量本身的类型和相应的读取长度,如:
  CopyMemory  IntegerValueAddress1, IntegerValueAddress2, 2 '读取两个字节。
      CopyMemory  LongValueAddress1, LongValueAddress2, 4 '读取四个字节。
  CopyMemory  SingleValueAddress1, SingleValueAddress2, 2 '读取两个字节。
  CopyMemory  DoubleValueAddress1, DoubleValueAddress2, 4'读取四个字节。
  若是任意字符串,则最后一个参数为字符串长度加一,因为在C语言中字符串末尾有一个'\0'。
  但无论复制何种变量,地址变量类型始终是Long类型,地址变量值的加减变化可改变在内存中的访问位置。
  若是使用DirectX做游戏,在DxVBLibA的D3DAUX模块中,有一个函数DxCopyMemory,功能也类似。

0

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2005-6-12 09:05:00 | 显示全部楼层

Re:如何读取内存数据

用ReadProcessMemory要直接一点,但要先打开进程.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-25 23:09

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表