なんてことは無い・・・ByValで値を渡していないことが原因。
などという・・・答えとしては非常に単純なのだが、
そんなの気付かねーよ。という問題で詰まっていた。
お手軽にVB6で作ってたのが原因っちゃ原因かなぁ。
他のプロセスのメモリーを読み取る部分抜粋。
・・・抜粋なのでこのままだと動かないかもー。
'Win32API連中の宣言 Public Declare Function FindWindow Lib "user32" Alias _ "FindWindowA" (ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Public Declare Function ReadProcessMemory Lib "kernel32" _ (ByVal hProcess As Long, lpBaseAddress As Any, _ lpBuffer As Any, ByVal nSize As Long, _ lpNumberOfBytesWritten As Long) As Long Public Declare Function OpenProcess Lib "kernel32" _ (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _ ByVal dwProcessId As Long) As Long Public Declare Function CloseHandle Lib "kernel32" _ (ByVal hObject As Long) As Long Public Declare Function GetWindowThreadProcessId Lib "user32" _ (ByVal hWnd As Long, lpdwProcessId As Long) As Long '定数宣言 Public Const SYNCHRONIZE = &H100000 Public Const STANDARD_RIGHTS_REQUIRED = &HF0000 Public Const PROCESS_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED _ Or SYNCHRONIZE Or &HFFF&) 'TargetNameのタイトル窓のAddr番地を読む Public Sub ReadMem(TargetName as String, Addr As Long) Dim lhWnd As Long Dim lHndl As Long Dim dwRead As Long Dim Temp$ Dim lRet As Long Dim Chars As Integer Chars = 256 lhWnd = FindWindow(vbNullString, TargetName) '窓タイトルで窓を探す If lhWnd <> 0 Then Call GetWindowThreadProcessId(lhWnd, PID) 'ProcessID取得 lHndl = OpenProcess(PROCESS_ALL_ACCESS, 0, PID) 'プロセスオープン If lHndl <> 0 Then Temp = String(Chars, " ") 'AddrアドレスからChars - 1 Byte分読み込んでTempに格納する lRet = ReadProcessMemory(lHndl, ByVal Addr, ByVal Temp, Chars - 1, dwRead) If lRet <> 0 Then Debug.Print Temp End If End If Call CloseHandle(lHndl) 'ハンドルの破棄 End If End Sub
詳しくは FindWindow GetWindowThreadProcessId OpenProcess ReadProcessMemory 辺りを
ぐぐってくれたまえ。
もしReadしてみて目的のアドレスの中身を返してるように見えないなぁ。って時は
ReadProcessMemoryに渡すアドレスが ByVal 渡しになってるか確認。
ってことらしい。
いや〜。解らなかったなぁ。
色々なAPI試して・・・紆余曲折した割にはそんなオチか・・・
何せ、これでネタのための種作りが可能になるぞ。