我模仿网上的资料写了段代码,想向地址为&H10021C3 写入&H5E这个数值,但总是发现并没有修改原来的数值,但要是改为写入“&H5E”就可以,也就是说只能按字符形式写入,不能按数值形式写入,在网上查了很久,都没有找到问题出在哪,望大侠帮我看看啊!!在线等!!万分感谢!!
整个代码如下:
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByVal lpBuffer As Long, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long
Declare Function GetLastError Lib "kernel32" () As Long
Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongDeclare Function VirtualProtectEx Lib "kernel32" (ByVal hProcess As Long, lpAddress As Any, ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As LongConst STANDARD_RIGHTS_REQUIRED = &HF0000
Const SYNCHRONIZE = &H100000
Public Const PROCESS_ALL_ACCESS As Long = STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF
Public Const PAGE_READWRITE      As Long = &H20
Public phwnd As Long
Public nameyanzheng As String
Public passyanzheng As String
Public phpid(1 To 100) As Long
Public i As Integer
Public namepid(1 To 100) As String
Public sum As IntegerFunction sev() As Integer
 ' 声明一些需要的变量
Dim hWnd As Long ' 储存 FindWindow 函数返回的句柄
Dim pid As Long ' 储存进程标识符( Process Id )
Dim pHandle As Long ' 储存进程句柄
Dim xinhwnd As Long
' 首先取得目标窗口的句柄
hWnd = FindWindow(vbNullString, "计算器")
If (hWnd = 0) Then
MsgBox "Window not found!"
Exit Function
End If
' 取得进程标识符
GetWindowThreadProcessId hWnd, pid' 使用进程标识符取得进程句柄
pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
phwnd = pHandle
If (pHandle = 0) Then
MsgBox "Couldn't get a process handle!"
Exit Function
End If
Sleep (8)' 在内存地址中写入名字Call WriteProcessMemory(pHandle, ByVal &H10021C3, ByVal &H5E, 1, 0&)
'如果写入值是&H5E,--F5后报“类型不匹配”错误!
'如果写入值改为&H5E&,--F5后就没有错误,但实际内存中的值并没有改变!也就是没有写入!但也不报错!
'如果写入值改为“&H5E”,--F5后,写入成功,原内存地址中的值按字符形式被更改!
'Call WriteProcessMemory(pHandle, ByVal &H10021C3,  &H5E, 1, 0&) 这样也不行CloseHandle hProcess            ' 关闭进程句柄
End Function

解决方案 »

  1.   

    在VB里面"&H5E"是16进制数的字符串表示形式,将其转换成Long型或Integer型以后就是对应的16进制值,比如将字符串"&H5E"转成Long型对应的就是16进制数0x5E,由于VB是以10进制进行输出的,所以将"&H5E"转成数值型输出以后结果就是94。debug.print clng("&H5E")
    输出结果为:94
      

  2.   

    同理在VB里面将10进制数转换成16进制数,得到的就是一个字符串。比如:
    debug.print Hex(94)
    输出结果为字符串:"&H5E"
      

  3.   

    我还是觉得你的解释不正确,理由如下:
    CLng、CInt、Val之类的函数不同于类C语言的强制类型转换,反而类似于.net的Convert类,将字符串转换成数值时会做一定的解释(interpret)。这并不意味着在VB里字符串(string)"&H5E"就等于(integer)94;
    VBA.Hex()函数返回一个数的十六进制的字符串,这也是做了转换之后的东西,Hex()隶属Convertion类。VB里表达十六进制数的方法是直接写&hxxx,例如&h5e。因此,虽然我不能解释楼主的问题所在,我还是建议楼主试试:
      

  4.   

    传值和传址的问题,参考http://topic.csdn.net/u/20080603/23/8078292b-0257-4b41-a0cc-cd4cbc7fc9f6.html