ReadProcessMemory Aktualisierung



  • Also konkret will ich den Spielstand in Fifa im Auge behalten, die Speicherstellen für die Heimtore und Auswärtstore habe ich, das Auslesen der Stellen funzt auch astrein. Nur wird ein Tor erzielt wird es erst angezeigt wenn ich das Programm neustarte, ich möchte daß das Programm die Änderung selbsständig erkennt und es ausgibt.

    ...
    ReadProcessMemory(hproc,(LPCVOID)adress1,&buffer1,sizeof(buffer1),&rw); //Auslesen der Speicherstelle
    Heimteam->Caption=buffer1; //Ausgabe der Tore Heim
    ...
    

    Mir gehts um die aktualisierung, damit ich vielleicht irgendwann einmal noch ne irc implentierung einbaue für einen livescorebot.



  • Eine Benachrichtigungsmöglichkeit gibt es da nicht. Man kann zwar für allokierte Speicherseiten einen WriteWatch erstellen, dieser erstellt aber auch nur eine Liste, die man bei Bedarf abrufen kann. Du musst also ReadProcessMemory in angemessenen Intervallen aufrufen, um Änderungen mitzubekommen.



  • genau das ist mein problem, nämlich die intervalle einzubauen 😞

    im mom sieht der kleine code snippet zum test so aus:

    GetWindowThreadProcessId(hWnd, &procid);
         hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procid);
         while (procid>0) {
          int buffer11;
          ReadProcessMemory(hproc,(LPCVOID)adress1,&buffer11,sizeof(buffer11),&rw);
          int *buffer12=&buffer11;
          if (*buffer12>buffer1)  
          Label3->Caption=*buffer12; //neuer Wert Auswärtstore
         }
    
        CloseHandle(hproc);//<-- Wichtig!
    

    Dies ist im Moment über einen Button implementiert, der Code ohne die while Schleife funktioniert, schieße ich in Fifa ein Tor und schalte zurück zum Tool und klicke auf den Button, werden die Auswärtstore angepasst auf den neuen Wert.

    Daher die Idee mit der while Schleife, solange der Prozess von Fifa läuft, soll er den Speicher durchsuchen und das Ergebnis aktualisieren. Aber egal wie ich es versuche, entweder wird die Form nicht angezeigt, oder das Programm hähgt in einer Endlosschleife und reagiert nicht mehr oder es hat 99% CPU Auslastung.

    Hat da jemand einen Tip oder besser ein kleines Codebeispielchen dafür? Wäre wirklich fein. Danke schonmal 🙂



  • Nutzt du den Borland C++ Builder(weil du das Fenster als "Form" bezeichnest)? In dem Fall wäre es wohl am sinnvollsten, deinen Aktualisierungscode über die Timer-Komponente aufrufen zu lassen. Intervalle von 100ms bis 1s sollten ausreichen.
    Ansonsten müsstest du den Code in einen zweiten Thread auslagern, damit dein Code nicht die gesamte Anwendung blockiert.



  • Danke für deine Antwort. Ich nutze Tatsache den Borland C++ Builder, aber die Timer Funktion hab ich noch nie benutzt, mal die Borland Hilfe zu Gemüte nehmen und evtl noch bissl googlen.

    Nen Intervall von 1 Sec reicht dicke, aber mit Timer läuft das doch auch nur eine bestimmte Zeit, oder? Ich mein wenns nicht anders geht, lager ich das zur Not in einen 2. Thread aus.



  • Es wird so lange die Ereignisprozedur des Timers in den gewünschten Intervallen ausgeführt, bis die Eigenschaft "enabled" des Timers auf false gesetzt wird.



  • grade getestet, geht auch nicht. Das Formular wird nicht angezeigt, bau ich aber im Form ein ShowMessage zum Test ein, poppt das immerwährend auf, wie es sein sollte, nur ohne ShowMessage tut sich vermeintlich nichts.

    Das kann nur bedeuten daß ich zu doof bin die Schleife an die richtige Stelle zu setzen, nur viel auswahl mit den Stellen gibts doch da nicht 😕



  • sry für den 2. Post, habe mich nun mal angemeldet damit ich auch editieren kann.

    also zu dem code oben, mache ich das über den Konsolen Experte und lasse das über cout ausgeben, klappt das einwandfrei, nur die Form will irgendwie nicht so recht 😕



  • Du darfst natürlich im Code der Ereignisprozedur die Speicherstelle nur einmal auslesen und nicht die alte Schleife beibehalten.



  • hm grade mal test gemacht, neues leeres form erstellt und nur folgenden code drin:

    int i=0;
    while (i==0) {
     }
    

    das formular wird damit auch nicht angezeigt, irgendwie hab ich da grad ne blockade im hirn, kriegs net auf die reihe.

    übern konsolen experte klapps einwandfrei, hier der screenshot: http://img454.imageshack.us/my.php?image=livescore1jj.jpg

    nur bei der windows portierung haperts 😞 vielleicht hat ja noch jemand ne idee wie ich das hinbekomme, vielleicht hab ich nach dem aufstehen auch wieder nen klaren kopf, ich geh erst mal pennen. gute nacht.



  • Na wenn du in deinem Programm eine Endlosschleife erstellst, wird es ewig dort festhängen und sich nicht mehr um das Fenster kümmern können. Um das Fenster der Konsole kümmert sich das Betriebssystem, da stört es also nicht, wenn der Prozess blockiert ist.
    Deshalb darfst du wie gesagt in der Timer-Ereignisprozedur den Speicher nur einmal auslesen. Um den nächsten Auslesevorgang kümmert sich dann ja der Timer und ruft die Funktion erneut auf. 🙄 🙂


Anmelden zum Antworten