回 帖 发 新 帖 刷新版面

主题:VB 内存写入

如何用API函数WriteProcessMemory在内存地址&H458571 中写入2261193076
内存中&H458571 这个位置能允许4个字节...
2261193076大于了long的范围.....
如果进行了数据转换 要保证数字的准确度,避免在转化中数据失真

回复列表 (共5个回复)

沙发

只要不大于unsigned long就有办法写入

将这个值先转换成long所对应的负数,然后写入就可以了。因为long和unsigned long在内存中是一样的,外在表现出来只是一个符号位的区别

没办法把无符号表现出来,是VB6的软肋

板凳

网上有个转换的代码  你自己搜下

3 楼

[quote]只要不大于unsigned long就有办法写入

将这个值先转换成long所对应的负数,然后写入就可以了。因为long和unsigned long在内存中是一样的,外在表现出来只是一个符号位的区别

没办法把无符号表现出来,是VB6的软肋[/quote]


负数一般为补码形式储存吧,正数则就是原码,但不清楚VB是怎样存的。。。

4 楼

&H86C71174 用十六进制表示就可以了。

5 楼

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Sub Form_Load()
  Dim I As Long
  
  If DoubletoLong(2261193076#, I) Then Debug.Print "I=" & I & " Hex(I)=&H" & Hex(I)
End Sub

'将无符号整数(dblNumber)转成以带符号整数(返回值在LngNumber中,保持其在内存中的值是四字节无符号整数的值)
Private Function DoubletoLong(ByVal DblNumber As Double, ByRef LngNumber As Long) As Boolean
  Const MaxLong As Long = 2147483647
  Const MaxULong As Double = 4294967295#
  Const MinLong As Double = -2147483648#
  
  Dim HL As Long
  
  If DblNumber > MaxULong Then
    Exit Function
  ElseIf DblNumber > MaxLong Then
    HL = DblNumber / 65536#
    LngNumber = DblNumber - CDbl(HL) * 65536#
    CopyMemory ByVal VarPtr(LngNumber) + 2, ByVal VarPtr(HL), 2
  ElseIf DblNumber < MinLong Then
    Exit Function
  Else
    LngNumber = DblNumber
  End If
  DoubletoLong = True
End Function

我来回复

您尚未登录,请登录后再回复。点此登录或注册