Brauche hilfe mit HANDLE, bitte !



  • Hallo,

    ich habe eine Funktion in meinem Programm welche immer Probleme macht, genauer gesagt, ein static HANDLE macht die Probleme.

    Das static HANDLE lässt sich (nachdem ich es als Snapshot benutzt habe für Process32First/Next) nicht beenden mit CloseHandle(), mit GetLastError bekomm ich den Fehlercode 6 -> INVALID_HANDLE_VALUE.

    Außerdem müsste ich das Handle wieder auf NULL setzen, nachdem ich es geclosed habe, dabei kommt aber immer ein Programmabsturtz (ist auch klar, wenn das Handle nicht geschlossen wurde)

    Weiß vielleicht jemand was ich übersehen hätte können ??

    Nachdem letzten Process32Next() aufruf, will ich das Handle schließen und auf NULL setzen. Wie kann es sein das der letzte Funktionsaufruf noch erflogreich ausgeführt wird, und danach ist das Handle invalid ???

    Ich hoffe ihr könnt mir helfen, danke schon mal fürs Lesen.



  • Weil dein Code fehlerhaft ist. Wieso muss es überhaupt static sein? Das ist doch schon der erste große Schnitzer, das kann ich sagen, bevor ich deinen Code überhaupt gesehen habe.



  • Wenn mein Code nicht fehlerhaft wäre, würde ich hier nicht posten.

    Die Funktion macht im Prinzip nichts anderes als eine eigene struct mit Informationen zu füllen. Die Funktion wird aslo so oft aufgerufen bis es keine Prozesse mehr gibt, dann gibt diese auch false zurück.

    Das Handle ist deswegen static, weil es z.B. beim 2. Aufruf nicht wieder mit NULL initialisiert werden soll, es soll ja den Wert behalten, den es von CreateToolhelp32Snapshot() bekommen hat, ansonsten würde ja Process32Next() nicht richtig funktionieren (oder irre ich mich???).



  • Sollen wir hier raten oder was? zeig deinen Code, wenn du Hilfe willst oder hau' ab, man! Wenn ich Mod wäre, wäre der Thread jetzt dicht! 👎



  • Kannst du bitte dein Ton ändern und dich wie ein normaler Erwachsener (oder Jugendlicher) verhalten? Wir sind hier nicht im Kindergarten, solche Äußerungen kannst du dir in Zukunft sparen.

    Hier ist der Code, wenn du so schlau bist wie du tust, wirst du den Fehler ja schnell finden...

    bool getProc(struct Process* pr) {
    
        static HANDLE hSnap = NULL;
        PROCESSENTRY32 *proc;
        HANDLE hProcess;
        DWORD ret;
        char *cPath = new char[MAX_PATH];
    
        proc->dwSize = sizeof(PROCESSENTRY32);
    
        if (hSnap == NULL) {
    
            hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
    
            Process32First(hSnap,proc);
    
            pr->ProcName = "Leerlaufprozess\0";
            pr->ProcID = proc->th32ProcessID;
    
            hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,proc->th32ProcessID);
    
            if (hProcess != NULL) {
    
                ret = GetModuleFileNameEx(hProcess,NULL,cPath,MAX_PATH-1);
    
            }
    
            if (ret != 0) {
                pr->ProcPath = cPath;
            } else {
                pr->ProcPath = NULL;
            }
    
            return true;
        }
    
        if(Process32Next(hSnap,proc)) {
    
            pr->ProcName = proc->szExeFile;
            pr->ProcID = proc->th32ProcessID;
    
            hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ ,FALSE,proc->th32ProcessID);
    
            if (hProcess != NULL) {
                ret = GetModuleFileNameEx(hProcess,NULL,cPath,511);
            }
    
            if(ret == 0) {
                ret = GetLastError();
                if (ret == 5 || ret == 299) {
                    strcpy(cPath,"unable to read path\0");
                } else {
                    sprintf(cPath,"ERROR: %i\0",ret);
                }
    
            }
    
            pr->ProcPath = cPath;
            return true;
    
        }
    
        CloseHandle(hSnap);    // Funktioniert nicht.
        //hSnap = NULL;        
        CloseHandle(hProcess);
        delete proc;
        delete[] cPath;
    
        return false;
    
    }
    


  • Wo initialisierst du

    PROCESSENTRY32 *proc;
    

    ? Der zeigt doch ins Nirgendwo! Und in so einer Situation static zu benutzen suckt einfach und zeugt von extrem schlechtem Stil.



  • Ja, ich dachte auch das daran der Fehler liegt, ich weiß das er mit new PROCESSENTRY32 initialisert wird, hab ich auch schon wieder geändert, aber wie gesagt, das ist nicht der Fehler.

    Inf.Student, wieso "suckt" es hier static zu verwenden ? Wann verwendest du static ?



  • Dachte ich mir ja, große Klappe und doch nichts dahinter.

    Wenn man sich den Quellcode ansieht, sieht man das ich vergessen habe die HANDLE von hProcess zu schließen, das war der Grund...



  • Glaubst du ich habe nix besseres zu tun, als das Forum im Minutentake zu refreshen , um deinen hässlichen Code zu reparieren? Mir ist schon gleich die Lust vergangen, als ich sah, daß du den Pointer nicht initialisiert hast. Da wusste ich, du bist ein totaler Noob, also beschäftige dich erstmal mit den Grundlagen, sonst wird das eh alles nix.



  • Du denkst auch du bist was bessers nur weil du Informatik studierst, was ?
    Wegen leuten wie dir sollte man hier das annonyme posten nicht mehr erlauben.



  • Was besseres im Sinne von mehr drauf haben, als 95% der restlichen User in diesem Board? Ja das tue ich in der Tat, das heißt aber noch lange nicht, daß ich viel kann. Es sagt lediglich aus, daß in diesem Board vornehmlich Leute wie du posten. Und jetzt genug Offtopic hier. Das war mein Schlußwort in dieser Diskussion.



  • Einbildung ist auch eine Bildung.



  • hi

    bin jetzt kein experte, aber soweit ich weiß sagt static, dass die Variable/Handle auch nach ende der funktion weiter benutzt werden kann
    und wenn du dann CloseHandle verwendest machst du ja genau den Vorteil wieder zu nichte.

    Vielleicht meckert er deshalb



  • Hallo!

    Nein, es lag daran das ich das andere Handle nicht geschlossen habe.

    Mit static deklarierte Variablen werden beim ersten z.B. static int a = 10; initialisiert, wenn ich die Funktion zum 2. mal aufrufe, hat diese zuweisung keinen Einfluss mehr auf die mit static deklarierte Variable.

    Das ist auch Absicht, weil diese Funktion ja in einer Schleife so oft aufgerufen wird, bis sie false zurück gibt. Wenn das Handle nicht static wäre, würde es bei jedem Funktionsaufruf wieder mit NULL initialisiert und es kommt zu einer Endlosschleife. Außerdem soll das Handle den Wert so lange beibehalten bis ich es schließe und wieder auf null setzte, wenn ich es nicht mehr benötige.

    Ich schließe das Handle, aber das beduetet nicht das ich die Variable hSnap lösche, hSnap bleibt weiterhin ein Handle.


Log in to reply