LOL wenn ich die Funktion unverändert in eine dll kopiere geht sie nicht mehr???



  • Hallo,
    ich schlage mich gerade mit einem sehr sehr seltsamen Problem herum:

    und zwar habe ich eine Funktion geschrieben um mir die Adresse einer Variablen mit bekanntem Wert zu besorgen(als einfaches Beispiel habe ich hier mal MineSweeper genommen), diese enthält auch einige andere eigene Funktionen aus einer eigenen dll die aber perfekt funktionieren

    hier mal der Code der problematischen Funktion:

    HWND hwnd=FindWindow(0, TEXT("MineSweeper")); 
    
        HANDLE handle=leserechte_holen(hwnd); 
    
        vector<DWORD> adressen; 
        cout<<"geben Sie den zu suchenden Wert ein!\n"; 
        int wert; 
        cin>>wert; 
        system("cls"); 
        cout<<"starte Scanvorgang; dies kann 1 - 15 min dauern...\n"; 
        scan_process_for_value(hwnd, wert, adressen); 
        cout<<"scanvorgang abgeschlossen;\n"<<adressen.size()<<" Uebereinstimmungen gefunden\n\n"; 
        system("PAUSE"); 
        system("cls"); 
        cout<<"Veraendern Sie den Wert der Zielvariable und geben Sie den neuen Wert ein\n"; 
        int neue_mienenzahl; 
        cin>>neue_mienenzahl; 
        system("cls"); 
        cout<<"gefilterte adressen werden erneut gescannt\n"; 
        vector<DWORD> neue_adressen; 
        rescan_adresses(handle, adressen, neue_mienenzahl, neue_adressen); 
        cout<<"Scan abgeschlossen\n"; 
        system("PAUSE"); 
        system("cls"); 
        cout<<"folgende Adressen wurden gefiltert:\n\n"; 
        for(int a=0;a<neue_adressen.size();a++) 
        { 
            cout<<hex<<"0x"<<neue_adressen[a]<<"\n"; 
        } 
        system("PAUSE"); 
        system("cls"); 
        cout<<"sollen die werte der adressen ersetzt werden(1) der nicht (2)?\n"; 
        int choice; 
        cin>>choice; 
        if(choice==1) 
        { 
        cout<<"durch welchen Wert soll ersetzt werden?\n"; 
        int wert_ersetzen; 
        cin>>wert_ersetzen; 
        system("cls"); 
        cout<<"beginne ersetzen...\n"; 
        bool success=werte_ersetzen(handle, neue_adressen, wert_ersetzen); 
        if(success==true) 
        { 
            cout<<"all values successfully replaced.\n"; 
        } 
        if(success==false) 
        { 
            cout<<"error while trying to replace the values, at least one value couldn't be replaced\n"; 
            cout<<"Error-code from getlasterror(): "<<GetLastError()<<"\n"; 
        } 
    
        } 
        else 
        { 
        }
    

    wenn ich diesen Code in die main.cpp einer ganz normalen win32 konsolenanwendung packe funktioniert alles perfekt und am ende steht im Vektor die Zieladresse 🙂 ;

    mein Problem ist jetzt aber wenn die diese Funktion gaaaanz genau so ohne irgendetwas zu ändern in eine dll packe
    zB so:

    __declspec(dllexport) scan_process(HWND hwnd) 
    { 
    //Code siehe oben 
    }
    

    (dabei lasse ich natürlich die erste Zeile aus obigem Code weg weil hwnd schon definiert ist) so funktioniert sie plötzlich nicht mehr wie gewünscht:

    😕 konkret äußert sich das dadurch dass zwar keine fehlermeldungen beim Kompilieren oder zur Laufzeit kommen aber der Zielvektor(in dem normal die gefundene(n) Adresse(n) stehen) am Ende der Funktion einfach leer ist 😕

    allerdings habe ich noch nicht mal ansatzweise eine Idee woher dieser komische Fehler kommen könnte weil ich am Code wirklich nichts geändert habe!(außer natürlich obigen code in eine Funktion zu packen )

    im Übrigen habe ich natürlich auch nichts an den Funktionen die ich aus der dll importiere gaändert.

    genau deswegen kann ich mir überhaupt nicht erklären warum das so ist 😞

    danke schonmal für eure Hilfe,
    andi01.



  • mal wieder lustiges code raten....
    Schon mal eines Debuggers bedient? 💡



  • ja habe ich (von MS Visual C++ 2008 EE), das problem dabei ist das das nur 1 Funktionsaufruf ist und der quellcode für den debugger nicht verfügbar ist weil die funktion in einer fertigen dll steht;

    in meiner main.cpp steht zB nur

    HWND hwnd=FindWindow(0, TEXT("MineSweeper"));
    
    get_adress(hwnd);//funktion aus dll
    

    der debugger hat ja den code von dern dll nicht dh es bringt nicht wirklich was zu debuggen...

    sobald ich den code aus der dll in die main.cpp statt dem funktionsaufruf packe geht alles perfekt 😕

    deswegen weiß ich auch überhaupt nicht wo ich nach dem Fehler suchen muss weil der Code selbst fehlerfrei ist(funktioniert ja in konsolenanwendung) nur sobald er in der dll steht geht er nicht mehr lol

    mfg,
    andi01.



  • falls es was helfen sollte hier nochmal eine genaue Beschreibung der Funktion und der fehler:

    -zur Funktion:
    Die Funktion ist dazu gedacht die Adresse einer Variable herauszufinden, deren Wert man kennt; deshalb wird zuerst der Adressraum des Prozessesnach dem bekannten Wert durchsucht, dann ändert der User den Wert und vorige adressen (im vektor adressen) werden auf den neuen wert gescannt (und adressen die den neuen wert haben im Vektor neue_adressen gespeichert).

    -zum Fehler:
    wenn ich obigen Code ganz normal in eine Kpnsolenanwendung packe funktioniert alles perfekt und zum Schluss steht nur noch die Zieladresse im Vektorneue_adressen 🙂 .

    sobald ich jetzt aber die Funktion völlig unverändert in eine dll kopiere und diese aus einer Konsolenanwendung heraus aufrufe ist schon im Vektor adressen die zieladresse nicht enthalten und damit logischerweise auch im Vektor neue_adressen.

    was mich daran so verwundert ist dass es ja nicht daran liegen kann dass irgendeine meiner anderen Funktionen (zB scan_process_for_value() ) falsch ist weil in einer Konsolenanwendung eben alles perfekt funktioniert 😕

    nur sobald ich den code in die dll packe kommt ein falsches Ergebnis heraus 😞

    falls das was hilft hier nochmal die Prototypen der eigenen Funktionen:

    HANDLE WINAPI leserechte_holen(HWND hwnd);
    
    void WINAPI scan_process_for_value(HWND hwnd, unsigned int value, vector<DWORD>& adressen);
    
    void WINAPI rescan_adresses(HANDLE process, vector<::DWORD>& adresses, unsigned int new_value, vector<DWORD>& positive_adressen);
    
    bool WINAPI werte_ersetzen(HANDLE process, vector<::DWORD>& adresses, unsigned int neuer_wert);
    

    ich habe wirklich überhaupt keine Ahnung woran das liegen könnte und wie gesagt der debugger hilft da auch nicht wirklich weiter 😞

    danke schonmal,
    andi01.



  • edit: hm die funktion scheint soweit zu gehen nur wenn man sie in eine andere einbaut(was ich gemacht habe) nicht:

    so sieht sie der code eigentlich aus:

    void get_adress(HWND hwnd, bool wert_bakannt)
    {
    if(wert_bekannt==true)
    {
    //do something
    }
    else
    {
    //hier steht obiger code
    }
    }
    

    was mich jetzt nur wundert ist wenn ich den code von oben in eine testfunktion packe geht er 😕 :

    void test(HWND hwnd)
    {
    //code von oben
    }
    

    woran kann das liegen?

    dnke schonmal,
    ansi01.



  • Warum kannst du eine DLL nicht debuggen, die du selbst entwickelst? Du hast doch den Code vorliegen, warum sollst du sie da nicht debuggen können? Mach dich mal über die Möglichkeitein deiner IDE schlau. In Delphi kann ich eine DLL zum Beispiel ohne weiteres debuggen, ich muss sie nur mit einem Hostprozess verbinden.



  • so habe jetzt meinen fehler gefunden: wenn ich den Befehl AllocConsole() aus der funktion entferne geht es, ich verstehe nur nocht nicht wirklich warum...

    und was das mit dem debuggen betrifft: das problem ist dass der compiler den sourcecode der dll nicht findet und ich auch nicht weiß wo ich das bei MS Visaul C++ 2008 EE einstellen kann 😞

    mfg,
    andi01.



  • Versuchs mal unter Projekteigenschaften -> Konfigurationseigenschaften -> Linker -> Debugging -> Debuginfo generieren: Ja und eventuell "Debugfähige Assembly" ebenfalls anschalten. Danach natürlich die dll neu kompilieren.



  • debug info generieren steht bei meiner konsolenanwendung bereits auf ja und bei debugfähige assembly steht "das attribut 'debugfähig' wurde nicht ausgegeben";

    edit: in der dll sind das dieselben Einstellungen^^

    also das ist es nicht denn das ist ja bereits eingestellt 😉

    aber was muss ich denn dann einstelln damit der debugger den sourcecode findet und v.a. wo muss ich es einstellen?

    danke schonmal,
    andi01.



  • Stell mal "Debugfähige Assembly" auf "Problemnachverfolgung zur Laufzeit ...". Das sagt ihm im Prinzip, dass er den Quellcode in die dll hineinkopiert. Dann muss er ihn nicht mehr suchen.



  • vielen dank an alle die dazugeholfen haben,
    jetzt funktioniert alles 🙂

    mfg,
    andi01.


Anmelden zum Antworten