Hallo erstmal,
ich bin relativ ein Anfänger in Sachen VB und eigentlich ist mein Fachgebiet PHP, nur leider komme ich nicht drumherum mich mit VB zu beschäftigen.
Folgendes Problem:
Ich benötige ein Script, welches aller 30 sek. eine Webseite aufruft und einen Wert vom Typ String sendet. Dieser Wert soll von einem Spiel aus dem Speicher ausgelesen werden.
Soweit so gut, habe ich das auch hinbekommen und zwar habe ich die API "ReadProcessMemory" dazu benutzt.
Nur möchte ich aber auch zusätzlich noch eine andere Seite aufrufen und zwar genau dann, wenn das Spiel beendet ist. Und ganau an dieser Stelle fangen meine Probleme an!
Denn die Speicheradresse, welche den Wert für das Spielende hat, ist vom Typ Integer (1 Byte). Nur leider funtzt das bei mir mit den ReadProcessMemory nicht. Da der Wert im Speicher vom Typ Integer ausgibt. Hier mal ein Beispielcode:
'1. Adresse: &H2F7E684 = Servername
'2. Adresse: &H122A220 = Gibt beim laufenden Spiel 1und bei Spielende 0 zurück
Const hMemAddr = &H2F7E684 'Speicheradressen (siehe oben)
Const sProcessID = "Fenstertitel meines Games" 'das sagt eigentlich schon alles
' ;)
Private Sub Form_Load()
Dim hwnd As Long
Dim pid As Long
Dim pHandle As Long
hwnd = FindWindow(vbNullString, sProcessID)
If (hwnd = 0) Then
MsgBox "Window not found!"
Exit Sub
End If
GetWindowThreadProcessId hwnd, pid
pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
If (pHandle = 0) Then
MsgBox "Couldn't get a process handle!"
Exit Sub
End If
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
' Declare some variables we need
Dim hwnd As Long
Dim pid As Long
Dim pHandle As Long
Dim sOutput As String * 20 ' Logisch, definiert sOutput als String
hwnd = FindWindow(vbNullString, sProcessID)
If (hwnd = 0) Then Exit Sub
GetWindowThreadProcessId hwnd, pid
pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
If (pHandle = 0) Then Exit Sub
Call ReadProcessMemory(pHandle, hMemAddr, sOutput, 20, 0)
Text1.Text = sOutput
CloseHandle hProcess
End Sub Das Modul:
Public Const PROCESS_ALL_ACCESS = &H1F0FFF
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 Any, 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 Any, ByVal lpBuffer As Any, ByVal nSize As Long, _
lpNumberOfBytesWritten As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Bei diesem Code gibt er genau das aus, was er ausgeben sollte, nämlich den Servernamen des Spieles.
Aber sobald ich die zweite Adresse (welche den Wert: 0 oder 1 zurückgibt ) benutze und "sOutput" als Integer definiere, erhalte ich die Fehlermeldung, dass die Typen unverträglich sind.
Wie schaffe ich es die 1 bzw. die 0 auszulesen? |