Wie Parameter and Thread übergeben?



  • #include <cstdlib>
    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    DWORD WINAPI threadGhost(LPVOID lpParameter)
          {
          int var = 1;
          while(1)
              {
              WriteProcessMemory(hGame, (LPVOID) address, &var, sizeof(&var), 0);
              }
          }
    
    int main(int argc, char *argv[])
    {
        DWORD  threadId;
        HANDLE threadHandle;
    
        threadHandle = CreateThread(NULL, 0, threadGhost, NULL, 0, &threadId);
        CloseHandle(threadHandle);
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Hi,

    Ich bin gerade dabei in C++ einen Trainer für ein Spiel zu programmieren,
    und benötige Threads um mehrere Schleifen laufen zu lassen.
    Im obigen Beispiel wird einfach ein Thread erstellt, der dafür sorgt,
    dass ständig der Wert der Adresse geändert wird. Nun meine Frage:
    Wie kann ich mehrere Parameter dem Thread übergeben (handle auf Game, Adressen, usw)?

    Das 'einfrieren' der Adresse sollte durch Tastendruck geschehen, und wenn bereits eine Schleife läuft dann kann ich keine andere Ausführen, darum möchte ich mich ein wenig mit Threads beschäftigen.

    Gruß 🙂



  • Hi!
    Packst du deine Parameter in eine Struktur und übergibst ihren Zeiger
    (Parameter Nummer vier von CreateThread).
    In der Threadfunktion kommst du über nen Cast an die Werte ran:

    DWORD WINAPI threadGhost(LPVOID lpParameter)
    {
      struct my_struct* ms = (my_struct*)lpParameter;
    ...
    

    Gruß,
    B.B.



  • So jetzt hab ichs erstmal geschafft überhaupt EINEN Parameter zu übergeben und hoffe ich habs richtig gemacht (jedenfalls funktionierts).

    #include <cstdlib>
    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    DWORD WINAPI threadGhost(LPVOID lpParam)
          {
          int numberThread = (int)lpParam;
          printf("%d\n", numberThread);
          }
    
    int main(int argc, char *argv[])
    {
        DWORD  threadId;
        HANDLE threadHandle;
        int numberMain = 123;
    
        threadHandle = CreateThread(NULL, 0, threadGhost, (LPVOID)numberMain, 0, &threadId);
        CloseHandle(threadHandle);
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Da ich mich leider noch nicht mit Strukturen beschäftigt hab, werd ich mich erst in nächster Zeit dazu melden. Und danke BB für die Antwort : D.

    ps.: Die Überschrift soll 'Wie Parameter AN Thread übergeben?' heißen!



  • der compiler scheint hier gnädig zu sein und macht aus (LPVOID)numberMain
    ein (LPVOID)**&**numberMain.
    denn bekanntlich ist meist numberMain != &numberMain.
    🙂



  • Das macht er sicher nicht!



  • wie erklärst du dir dann, das die ausgabe 123 ist?



  • ich meine ja auch nicht, das dann hinterher das &-zeichen auf einmal im quellcode steht, sondern nur das verhalten an sich.



  • Faden schrieb:

    Da ich mich leider noch nicht mit Strukturen beschäftigt hab,...

    Vielleicht solltest du dich erstmal mit den Grundlagen beschäftigen bevor du threads losläßt. 😉



  • zeig0r schrieb:

    wie erklärst du dir dann, das die ausgabe 123 ist?

    Im Thread wird ja der Parameter ebenfalls nicht als Zeiger interpretiert, sondern ganz einfach nach int gecasted.



  • zeig0r schrieb:

    ich meine ja auch nicht, das dann hinterher das &-zeichen auf einmal im quellcode steht, sondern nur das verhalten an sich.

    Mach das & mal beim Aufruf mit rein, und Du wirst sehen, daß die Ausgabe im Thread nicht mehr 123 ist.



  • Belli schrieb:

    zeig0r schrieb:

    wie erklärst du dir dann, das die ausgabe 123 ist?

    Im Thread wird ja der Parameter ebenfalls nicht als Zeiger interpretiert, sondern ganz einfach nach int gecasted.

    stimmt, das ist der grund, das es funzt! ichi war ein wenig nachlässig.

    @Faden:
    ohne verluste klappt das so aber nur mit datentypen sizeof(T) <= sizeof (LPVOID).
    prizipiell korrekte sytax für die übergabe ist dennoch
    C++:
    (LPVOID)**&**numberMain
    C:
    **&**numberMain
    und für die übernahme in der threadfunktion:

    threadGhost(LPVOID lpParam)
    {
        T* t = (T*)lpParam;
    ...
    


  • Noch eine Frage:
    Wie kann man das Hauptprogramm von einem Thread aus schließen?

    Ich hab einen Thread gestartet, der immer überprüft ob das Spiel noch läuft (FindWindow).
    Wenn nicht soll der Trainer geschlossen werden.



  • indem das hauptprogramm auf den thread wartet und sich beendet
    mfg



  • Alter was soll die scheiße mit den namen.
    Wir sind hier nicht bei den 1337Kiddys 'beend0r'



  • User123 schrieb:

    Alter was soll die scheiße mit den namen.
    Wir sind hier nicht bei den 1337Kiddys 'beend0r'

    if you think to f... is funny, f... yourself and you save m0ney 🙂



  • Verpiss dich ausm Forum du scheiß 1337 Kind.



  • User123 schrieb:

    Verpiss dich ausm Forum du scheiß 1337 Kind.

    Willst du an meinem großen Onkel nuck0ln?



  • nuckl0r schrieb:

    User123 schrieb:

    Verpiss dich ausm Forum du scheiß 1337 Kind.

    Willst du an meinem großen Onkel nuck0ln?

    Das einzige was an deinem Körper groß ist, ist deine Klappe.



  • User123 schrieb:

    nuckl0r schrieb:

    User123 schrieb:

    Verpiss dich ausm Forum du scheiß 1337 Kind.

    Willst du an meinem großen Onkel nuck0ln?

    Das einzige was an deinem Körper groß ist, ist deine Klappe.

    *bussieknutschie*
    schatzi
    :x


Anmelden zum Antworten