Funktion geht nur wenn man sie aufteilt?!



  • Hallo, ich bin gerade dabei die adresse einer Variablen mit bekanntem Wert herauszufinden.

    mein Problem dabei ist wenn ich die Funktion einzeln benutze geht alles wunderbar, hier mal der code dazu:

    void test(HWND hwnd)
    {
    		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";
    #ifdef _DEBUG//im debugmode nur checken
    	bool dabei=false;
    	for(int a=0;a<adressen.size();a++)
    	{
    		if( adressen[a]== (DWORD) "1005194" || adressen[a]== (DWORD) "f568a" ||adressen[a]==(DWORD)"16798100")
    		{
    			dabei=true;
    			cout<<"Zieladresse(1005194) war dabei!";
    			break;
    		}
    	}
    	if(dabei==false)
    	{
    		cout<<"Zieladresse war leider nicht dabei =( \n";
    	}
    #endif
    	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";
    	}
    #ifdef _DEBUG
    	cout<<"Größe der neuen Vektors: "<<neue_adressen.size()<<endl;
    #endif
    	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
    	{
    	}
    
    }
    

    wie gesagt, dieser Code funktioniert super 🙂 jetzt zu dem seltsamen problem:
    wenn ich obigen code in eine andere Funktion einbaue geht er nicht mehr 😕

    die andere Funktion sieht zB so aus:

    void get_adress(HWND hwnd, bool wert_bekannt)
    {
    if(wert_bekannt==true)
    {
    //dieser Teil funktioniert deshalb ist er hier gekürzt^^
    }
    
    if(wert_bekannt==false)
    {
    //hier steht der Code von oben
    }
    }
    

    das komische dabei ist dass der Code im oberen beispiel perfekt funktioniert aber sobald ich ihn wie unten in eine eigene Funktion einbaue werden völlig falsche ergebnisse geliefert, d.h. in den vektoren stehen plötzlich vollkommen falsche variablenadressen usw.

    allerdings habe ich nichtmal ansatzweise eine Shnung woran das liegen könnte 😞

    (debuggen nützt da leider nichts weil die Funktion eigentlich in einer dll steht und der debugger keinen sourcecode dazu hat)

    woran kann das liegen? eigetnlich sollte das doch funktionieren...

    danke schonmal,
    andi01.



  • Es ist unwahrscheinlich, dass du damit Hilfe bekommst. Du solltest das Ganze auf ein leserliches Beispiel reduzieren, so klein wie möglich, aber der Fehler muss reproduzierbar sein.

    Dass der Debugger keinen Sourcecode findet, ist nur eine Einstellungssache. Im Modulfenster vom Visual Studio-Debugger kann man mit Rechtsklick auf die DLL Symbole nachladen, dann wird ggf. nach dem Verzeichnis mit dem Quellcode gefragt.



  • Wie wärs damit?

    void get_adress(HWND hwnd, bool wert_bekannt)
    {
    if(wert_bekannt==true)
    {
    //dieser Teil funktioniert deshalb ist er hier gekürzt^^
    }
    
    if(wert_bekannt==false)
    {
    void test(hwnd);
    }
    }
    

    Und wie Nukularfüsiker schon sagte, mehr Struktur und weniger alles in eine Funktion packen hilft.
    Der Grund könnte sein, dass er mit lokalen und globalen Variablen durcheinander kommt.

    Beispiel:

    int i = 5;
    int bla(){
        cout << i;
    }
    
    int main(){
        int i = 7;
        bla(); //ergibt 5
        //bla reinkopiert:
        cout << i; //ergibt 7
    }
    


  • Dass der Debugger keinen Sourcecode findet, ist nur eine Einstellungssache. Im Modulfenster vom Visual Studio-Debugger kann man mit Rechtsklick auf die DLL Symbole nachladen, dann wird ggf. nach dem Verzeichnis mit dem Quellcode gefragt.

    das wäre schonmal ein ansatz, so kann ich den fehler wenigstens mal effektiv suchen^^ nur wo muss man das bei MS Visual C++ 2008 EE eisntellen? wie komme ich in dieses sog. "Modulfenster"?

    ansonsten werde ich jetzt die funktion mal stück für stück auseinander nehmen und schaun ab welchem Schritt der Fehler auftritt um das ganze auf ein kleines Codebeispiel zu reduzieren^^

    mfg,
    andi01.



  • 😕 LOL ich habe jetzt meine Funktion stück für stück auseinender genommen und die vermeindliche Fehlerursache gefunden: 😕

    so hatte ich es bisher und es ging nicht:

    void get_adress(HWND hwnd, bool wert_bekannt)
    {
    
    AllocConsole();//falls die Funktion nicht in einer Konsolenanwendung läuft
    
    if(wert_bekannt==true)
    {
    //do something
    }
    
    else
    {
    //do something else
    }
    }
    

    😕 jetzt habe ich einfach AllocConsole weggelassen und alles funktioniert perfekt 😕

    kann mir bitte mal jemand erklären warum AllocConsole() dafür verantwortlich ist dass in meinen Vektoren völlig falsche Werte landen und auch sonst so ziemlich alles in der Funktion schief ging?

    edit: für das problem mit dem debuggen habe ich jetzt eine Lösung gefunden 🙂

    für alle die dasselbe Problem haben:

    unter Projekteigenschaften -> Konfigurationseigenschaften -> Linker -> Debugging -> Debuginfo generieren: Ja und unter "Debugfähige Assembly" "Problemnachverfolgung zur Laufzeit ..." einstellen . Danach natürlich die dll neu kompilieren.

    mfg,
    andi01.


Log in to reply