∈怪有关问题→WriteProcessMemory写目标进程后导致XXXXX调用的内存XXXXXX不能为READ?

∈怪问题→WriteProcessMemory写目标进程后导致XXXXX调用的内存XXXXXX不能为READ???
如题,不是我写错了..
参数可以保证完全正确,并且写入地址并不是对方程序的代码地址,而是其数据地址,这些数据是经过测试的,完全正确。

在一个Timer1_Timer里调用下面这个函数(当不在Timer1_Timer里调用时不会出错,奇怪啊!!):

'将修改内存
Public   Function   SetData(ByVal   lppid   As   Long,   ByVal   lpDestAddr   As   Long,   lpSrcAddr()   As   Byte,   Optional   ByVal   dtLen   As   Long   =   4)   As   Boolean
On   Error   GoTo   mErr
Dim   lBytesReadWrite   As   Long
Dim   pHandle   As   Long   '   储存进程句柄
'   使用进程标识符取得进程句柄
GamePid   =   lppid
pHandle   =   OpenProcess(PROCESS_ALL_ACCESS,   False,   lppid)
WriteProcessMemory   pHandle,   ByVal   lpDestAddr,   ByVal   VarPtr(lpSrcAddr(0)),   dtLen,   0&
'   关闭进程句柄
CloseHandle   pHandle
SetData   =   True
mErr:
End   Function

还请高手GG们帮忙我一下下。。。。。。。非常纳闷ING……


拿什么拯救你,我的大富翁。

------解决方案--------------------
XXXXX调用的内存XXXXXX不能为READ

看看地址

然后记下来,在他内存里找找这地址
------解决方案--------------------
暴风雨找的那个东东不知道是不是这个?

http://www.m5home.com/bbs/dispbbs.asp?boardID=10&ID=1344&page=1

我以前搞成了一个工程的,不过忘了是不是它....
------解决方案--------------------
先用VirtualProtectEx将目标内存页的权限改为可写,否则不能用WriteProcessMemory


------解决方案--------------------
WriteProcessMemory之前,
先Debug一下pHandle,看是不是0?
再Debug一下ubound(lpSrcAddr)+1与dtLen,看是不是dtLen超出了数据长度。

另外
ByVal VarPtr(lpSrcAddr(0))与Byref lpSrcAddr(0), 应该是一个效果,不过后者更可靠一些,你可换一下。
------解决方案--------------------
//仍然未解决啊

改成什么样子了
------解决方案--------------------
豆豆的代码,第一个是设置读写权限,第二个是还原。